0

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

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

#define FOO omp
#pragma FOO parallel

所以我需要将其解释为:

#pragma omp parallel

我在 Linux 中使用 GCC。从我目前阅读的内容来看,这似乎不受支持。有什么解决方法吗?

4

2 回答 2

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 预处理器块来实现类似的东西P99_PARALLEL_FORP99_PARALLEL_FORALL使用这些技巧。

于 2013-05-09T20:40:48.470 回答
0

There was gcc developer discussion about a patch that accepted a "-fexpand-pragmas" command-line option in 2006:

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

but that option does not appear to be recognized

于 2013-05-09T20:09:06.617 回答