我想通过创建适当的宏来简化一些预处理器代码。我想换行
#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
它会扩展到我的期望吗?什么将作为“论证”传递给STRINGIFY
? omp critical(x value)
,或者omp critical(x value
?在这种情况下括号是否匹配?
程序正常运行。但我不太了解宏,所以它可能产生一些编译代码,有时可以工作,有时不工作。你可能知道,并行的东西很奇怪,所以我想确保它是正确的。
答案 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 调用宏)。 替换的预处理序列 令牌由匹配的预处理令牌终止,跳过 插入匹配的左右括号预处理对 令牌即可。在预处理令牌组成的序列中 调用类似函数的宏,新行被认为是正常的 白色空间。