我想在 C 函数中包装一个类似函数的 C 宏(然后用{#fun ... #}
块将它包装在 Haskell 中),但是预处理器在语法c2hs
上窒息;do.. while(0)
这是代码:
module TestMacro where
#c
#define TestF1(n) do{if n==0 return 0;else return 1; } while(0)
int c_testF1(int x)
{ return ( TestF1(x) ); }
#endc
这是错误:
c2hs TestMacro.chs
c2hs: C header contains errors:
TestMacro.chs.h:6: (column 12) [ERROR] >>> Syntax error !
The symbol `do' does not fit here.
make: *** [main] Error 1
我究竟做错了什么?我的目标是包装CHKERRQ
PETSc 库的宏,定义如下petscerror.h
(为了便于阅读,拆分为多行):
#define CHKERRQ(n)
do {if (PetscUnlikely(n))
return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,n,PETSC_ERROR_REPEAT," ");}
while (0)