C m4不解析局部变量

C m4不解析局部变量,c,m4,C,M4,我的m4宏有问题。宏是 define(BARRIER, ` #if defined USE_PTHREAD_BARRIERS barrier_wait(&$1,$2,$3); #elif defined (USE_CENTRALIZED_BARRIERS) central_barrier(&$1,$2,$3); #endif ') 在我的.C文件中 BARRIER(Global->start,p,MyNum)其中Global->start和p是全局变量,MyNum是局部变量 但

我的m4宏有问题。宏是

define(BARRIER, `
#if defined USE_PTHREAD_BARRIERS
barrier_wait(&$1,$2,$3);
#elif defined (USE_CENTRALIZED_BARRIERS)
central_barrier(&$1,$2,$3);
#endif
')
在我的.C文件中

BARRIER(Global->start,p,MyNum)
其中
Global->start
p
是全局变量,MyNum是局部变量

但当我执行

m4 macrosfile.m4 sourcefile > outputfile
在输出文件中有以下内容:

#if defined USE_PTHREAD_BARRIERS
barrier_wait(&Global->start,P,);
#elif defined (USE_CENTRALIZED_BARRIERS)
central_barrier(&Global->start,P,);
我的宏有问题,或者只是一个限制


提前感谢。

您可以尝试更改:

BARRIER(Global->start, P, MyNum)
致:

至于我,我会尝试使用一个或类似的工具来避免m4:

#if defined USE_PTHREAD_BARRIERS
#define BARRIER_X(x_, y_, z_) barrier_wait(&x_, y_, z_)
#elif defined (USE_CENTRALIZED_BARRIERS)
#define BARRIER_X(x_, y_, z_) central_barrier(&x_, y_, z_)
#endif


m4
作为C的预处理器?据我所知,C有一个内置预处理器否?-)@JensGustedt是的,我知道,但通过这种方式,用户可以在不同的程序和项目中重用相同的宏。我也被迫这样做……倒勾/撇号引用实际上是一个不错的选择,因为倒勾不太可能出现在代码中。因此,您通常可以使用m4来翻译源代码,而无需进行任何更改。(当然,如果您需要不同的引号字符,m4允许这样做。)
#if defined USE_PTHREAD_BARRIERS
#define BARRIER_X(x_, y_, z_) barrier_wait(&x_, y_, z_)
#elif defined (USE_CENTRALIZED_BARRIERS)
#define BARRIER_X(x_, y_, z_) central_barrier(&x_, y_, z_)
#endif
BARRIER_X(Global->start, P, MyNum);