如何将宏扩展用于pragma的第一个标识符?

时间:2013-05-09 19:15:10

标签: c linux gcc c-preprocessor pragma

如果我想定义编译指示的第一个标识符,我该怎么做?

例如,我需要这样的东西作为openmp pragma:

#define FOO omp
#pragma FOO parallel

所以我需要将其解释为:

#pragma omp parallel

我在Linux中使用GCC。从我到目前为止所阅读的内容来看,这似乎并不受支持。有什么办法吗?

2 个答案:

答案 0 :(得分:4)

从C99开始,我们有_Pragma运算符,它基本上允许您将#pragma的内容放在任何地方,不仅仅是在它自己的一行上,而是让它受宏扩展的影响。像

这样的东西
#define STRINGIFY_(...) #__VA_ARGS__
#define STRINGIFY(...) STRINGIFY_(__VA_ARGS__)
#define FOO omp
#define PARALLEL(...) _Pragma(STRINGIFY(FOO parallel __VA_ARGS__))

然后

PARALLEL(private(a))
for(size_t i = 0; i < NUM; ++i)
  ....

应该这样做。

如果您只是对使用这些内容感兴趣(与编写这些宏相比),您可以使用P99 preprocessor blocks来实现P99_PARALLEL_FORP99_PARALLEL_FORALL这样的技巧。

答案 1 :(得分:0)

gcc开发人员讨论了2006年接受“-fexpand-pragmas”命令行选项的补丁:

http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00084.html

但该选项似乎无法识别