宏与_Pragma - 括号

时间:2018-06-17 13:07:13

标签: c c-preprocessor pragma

我想通过创建适当的宏来简化一些预处理器代码。我想换行

#ifdef _OPENMP
    _Pragma("omp critical(stdout)")
#endif

成单

_OMP_CRITICAL(stdout)

所以我做了

#ifdef _OPENMP
    #define STRINGIFY(x) #x
    #define _OMP_CRITICAL(x)    _Pragma(STRINGIFY(omp critical(x)))
#else
    #define _OMP_CRITICAL(x)
#endif

它会扩展到我的期望吗?什么将作为“论证”传递给STRINGIFYomp critical(x value),或者omp critical(x value?在这种情况下括号是否匹配?

程序正常运行。但我不太了解宏,所以它可能产生一些编译代码,有时可以工作,有时不工作。你可能知道,并行的东西很奇怪,所以我想确保它是正确的。

1 个答案:

答案 0 :(得分:2)

是的,它必须正确匹配。引用C11 (n1750) §6.10.3 ¶10(强调我的):

  

表单

的预处理指令
# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
     

使用参数定义类似函数的宏,其用法类似   语法上的函数调用。参数由。指定   可选的标识符列表,其范围从它们的范围扩展   在标识符列表中声明,直到换行符   终止#define预处理指令。随后每一次   类似函数的宏名称的实例后跟一个(作为下一个   预处理令牌引入了预处理令牌的序列   由定义中的替换列表替换(an   调用宏)。 替换的预处理序列   令牌由匹配的预处理令牌终止,跳过   插入匹配的左右括号预处理对   令牌即可。在预处理令牌组成的序列中   调用类似函数的宏,新行被认为是正常的   白色空间。