如何为编译指示创建包装器并使其正确编译?

How do I create a wrapper for a pragma and have it compile properly?

我一直在尝试围绕 MPI 和 OpenMP 构建一个包装器以使用统一格式进行编码,而不必在 MPI_xxx、omp_xxx 和 #pragma omp xxx 之间切换。

我在围绕各种#pragma omp 指令创建包装器时遇到了问题,到目前为止我得到的最好的方法是将它作为:

#define _mmc_(x) _Pragma("omp ## #x")

(mmc是我图书馆暂定的名字)

所以如果我想要

#pragma omp parallel for

对应的wrapper应该是

_mmc_(parallel for)

然而,当它编译时,编译器似乎对它进行了不同的评估,给我编译警告

test.cpp:22:0: warning: ignoring #pragma omp  [-Wunknown-pragmas]
     _mmc_(parallel for)

我正在 Ubuntu 14.04 中围绕 gcc 4.8.4 使用 mpic++ 为 MPICH 3.0.4 编译,带有标志

-fopenmp -lm -std=c++11 -Wall

有什么我可以做或添加到代码中以使其工作的,还是这只是当前工具无法完成的事情?

这应该有效,as seen here:

#define PRAGMA(x) _Pragma(#x)
#define _mmc_(x) PRAGMA(omp x)

_Pragma 对字符串文字有点严格,所以我们从整个 pragma 参数字符串中生成该文字,而不是在 _Pragma 中将其拼凑在一起。正如您在 post.

中尝试的那样,预处理器运算符将无法在字符串文字中工作