C++ 中预处理器方法的别名

Alias for preprocessor methods in C++

我正在编写一个将使用 openmp 的库,但是我想让用户能够 disable/enable 我的库 openmp 使用预处理器定义(以防他们想要使用 openmp 但避免没有我的库使用它)

最明显的解决方案类似于

void foo() {
#ifndef disable
#pragma omp parallel for
#endif
    for (int i = 0; i < 100; ++i) {
        std::cout << i << " " << std::endl;
    }
#ifndef disable
#pragma omp barrier
#endif

不过我有很多使用openmp的方法。 有什么方法可以为 openmp 创建别名吗?

IE:

#if OpenMpSupported 
#define AliasParallel = #pragma omp parallel for
#define AliasBarrier  = #pramgma omp barrier
#else 
#define AliasParallel = //some thing that doesn't matter
#define AliasBarrier = //some thing that that doesn't matter
#endif

void foo() {
#AliasParallel
    for (int i = 0; i < 100; ++i) {
        std::cout << i << " " << std::endl;
    }
#AliasBarrier

简而言之,我可以为此创建一个 shorthand。

一般情况下是没有办法做到这一点的。 # 指令不重新扫描宏展开的结果。

但是,在 #pragma 的特殊情况下,还有一个替代方案 (since C++11):

_Pragma("foo bar")

相当于

#pragma foo bar

前者可以通过宏生成

你的情况是:

#if OpenMpSupported 
#define AliasParallel _Pragma("omp parallel for")
#define AliasBarrier  _Pragma("omp barrier")
#else 
#define AliasParallel
#define AliasBarrier
#endif

void foo() {
AliasParallel
    for (int i = 0; i < 100; ++i) {
        std::cout << i << " " << std::endl;
    }
AliasBarrier

(不过我不知道这是否适用于 openmp。)