在GCC的_Pragma运算符中粘贴预处理程序令牌

时间:2011-09-30 09:09:59

标签: c++ gcc c-preprocessor

我正在尝试执行与another question类似的操作,即在我的程序中有条件地包含OpenMP pragma。但是,我想更进一步,避免用户每次使用pragma时都需要指定omp。换句话说,我想要编译以下代码:

#include <cstdio>
#include <omp.h>

#ifdef _OPENMP
#   define LIB_PRAGMA_OMP(x) _Pragma("omp " #x)
#else
#   define LIB_PRAGMA_OMP(x)
#endif

int main() {
    LIB_PRAGMA_OMP(parallel) {
        std::printf("Hello from thread %d\n", omp_get_thread_num());
    }
}

不幸的是,这不起作用。编译器抱怨:

  

错误:_Pragma采用带括号的字符串文字

如果我使用下面的表格,它的确有效:

#define LIB_PRAGMA_OMP(x) _Pragma(#x)

…

LIB_PRAGMA_OMP(omp parallel) …

但是,我真的想避免这种冗余。 如何在_Pragma运算符中正确粘贴(字符串化)标记?

2 个答案:

答案 0 :(得分:9)

经过多次反复试验后,事实证明最简单的解决方案有效:

#ifdef _OPENMP
#   define LIB_PRAGMA_OMP(x)  DO_PRAGMA(omp x)
#   define DO_PRAGMA(x) _Pragma ( #x )
#else
#   define LIB_PRAGMA_OMP(x)
#endif

使用-DOPENMP,我得到:

# 12 "test_op.cpp"
#pragma omp parallel
# 12 "test_op.cpp"

没有它,没有。

答案 1 :(得分:1)

#define MAKE_STRING(x)  #x
#define LIB_PRAGMA_OMP(x) _Pragma(MAKE_STRING(omp x))

如果您愿意,也可以。我更喜欢它,因为它可以最小化此辅助函数的工作量。