代码之家  ›  专栏  ›  技术社区  ›  Joseph Franciscus

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

  •  0
  • Joseph Franciscus  · 技术社区  · 7 年前

    我正在写一个图书馆 openmp 但是,我想让用户能够禁用/启用我的库 并行算法 使用预处理器定义(如果他们想使用 并行算法 但避免让我的lib使用它)

    最明显的解决方案是

    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
    

    简单地说,我可以为这个创建一个速记。

    1 回复  |  直到 7 年前
        1
  •  3
  •   melpomene    7 年前

    一般来说,没有办法做到这一点。宏扩展的结果不会重新扫描 # 指令。

    然而,在 #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。)