如果我想定义编译指示的第一个标识符,我该怎么做?
例如,我需要这样的东西作为openmp pragma:
#define FOO omp
#pragma FOO parallel
所以我需要将其解释为:
#pragma omp parallel
我在Linux中使用GCC。从我到目前为止所阅读的内容来看,这似乎并不受支持。有什么办法吗?
答案 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_FOR
和P99_PARALLEL_FORALL
这样的技巧。
答案 1 :(得分:0)
gcc开发人员讨论了2006年接受“-fexpand-pragmas”命令行选项的补丁:
http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00084.html
但该选项似乎无法识别