为什么我不能在 PETSc 中使用 CHKERRQ 宏编译函数?

计算科学 宠物 编译
2021-11-28 07:07:29

我编写了一个函数来读取我的程序采用的运行时参数。此函数与我的主程序位于不同的文件中;编译后链接两个目标文件。

当我编译包含用于读取参数的函数的文件时,我收到以下警告:

io.c(43): warning #120: return value type does not match the function type
CHKERRQ(ierr);
^

这似乎只影响CHEKRRQ()宏,当我编译 PETSc 中包含的示例时,我没有收到此警告。唯一明显的区别是该示例完全在一个文件中,而我的程序被分解为多个文件。

CHKERRQ()PETSc 是否支持单独编译,或者宏的某些方面是否会导致问题?

2个回答

CHKERRQ只能在返回的函数中使用PetscErrorCode

PETSc 文档这里相当清楚:

CHKERRQ- 检查错误代码,如果非零则调用错误处理程序然后返回

CHKERRQ(n)基本上是一个宏替代:

if (n) return(PetscError(...,n,...));

尽管典型用法与void CHKERRQ(PetscErrorCode)上述类似,但对于某些用途,在调用return(PetscErrorCode). 特别是,它不能用于函数 whichreturn(void)或任何其他数据类型。在这些类型的函数中,您可以使用CHKERRV()which 返回没有错误代码(这是个坏主意,因为错误被忽略了,或者if (n) {PetscError(....); return(YourReturnType);}您可以在其中传回 aPETSC_NULL以指示错误。您也可以调用CHKERRABORT(comm,n)MPI_Abort()立即返回。

CHKERRQmain()除了不返回之外,不能在函数内部使用PetscErrorCode这是因为CHKERRQ()宏基本上是

if(ierr) {PetscError(..,ierr,..);return ierr;}

文档中:

尽管典型用法类似于上述“void CHKERRQ(PetscErrorCode)”,但对于某些用途,以这种方式使用它是非常不合适的,因为它会调用 return(PetscErrorCode)。特别是,它不能用于 return(void) 或任何其他数据类型的函数。在这些类型的函数中,您可以使用 CHKERRV() ,它返回时没有错误代码(坏主意,因为错误被忽略或 if (n) {PetscError(....); return(YourReturnType);} 你可以通过返回一个 PETSC_NULL 表示错误。您也可以调用 CHKERRABORT(comm,n) 以立即返回 MPI_Abort()。

基本上,任何使用的函数都CHKERRQ()应该返回PetscErrorCode自己或CHKERRV()改为使用。