【问题标题】:How can I use macro expansion for the first identifier of a pragma?如何使用宏扩展作为编译指示的第一个标识符?
【发布时间】:2013-05-09 19:15:10
【问题描述】:

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

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

#define FOO omp
#pragma FOO parallel

所以我需要将其解释为:

#pragma omp parallel

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

【问题讨论】:

  • 我不认为预处理器处理编译指示,这意味着没有办法做你想做的事。
  • @JoachimPileborg #pragma 不是像 #define#include 一样的预处理器指令吗。它的一切都依赖于编译器吗?预处理器忽略#pragma?
  • @JoachimPileborg 我读过很多关于编译指示的东西都依赖于编译器,但从来不知道预处理器根本不处理编译指示。是这样吗?
  • 好吧,我知道使用类似:#define FOO parallel#pragma omp FOO 将用作:#pragma omp parallel
  • 你也许可以使用_Pragma 而不是#pragma

标签: c linux gcc c-preprocessor pragma


【解决方案1】:

从 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 之类的东西。

【讨论】:

  • 我尝试了这个和它的一些变体,但该行最终仍被解释为#pragma FOO parallel
  • @Chris,对不起,你必须再做一级宏扩展,请看我的编辑。
  • 对我来说最终被解释为:#pragma "FOO parallel __VA_ARG__" 你在用 gcc 编译吗?
  • 是的,gcc v. 4.6。使用它(对__VA_ARGS__ 进行更正,抱歉)和-std=c99 -fopenmp 可以正常工作。此外,当使用 clang 作为编译器时,它会告诉我 &lt;scratch space&gt;:3:2: note: expanded from macro '_Pragma' omp parallel private (a)
  • 对我来说,它最终被解释为#pragma "FOO parallel private(a)" 我使用的是 gcc v. 4.4,所以我猜这就是我从你那里得到不同结果的原因。我想我想用 gcc v. 4.4 做不到,我将不得不找到另一个解决方案。不过感谢您的帮助。
【解决方案2】:

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

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

但该选项似乎无法识别

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 2022-07-06
    • 2019-06-09
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多