【问题标题】:concatenate prefix in the function name with macro?将函数名中的前缀与宏连接起来?
【发布时间】:2019-09-26 11:23:03
【问题描述】:

我想在函数名的开头连接一些宏:

#include <stdio.h>

#define PFX mypfx

int PFX##_call() {
    printf("teeeeeeeeest");
}

int main(void)
{
    mypfxcall();
}

以上代码编译返回错误。

如何在函数名中添加宏前缀?

【问题讨论】:

  • 为什么?真的,这似乎只是一种混淆练习。
  • 你真正想要实现什么?闻起来像xy problem
  • 这样的宏是让人们永远不想使用或维护您的代码的好方法
  • 请选择一种语言,在 c++ 中,宏有 1 个可能有 2 个用例(你的不是其中之一),在 c 中我不知道
  • 有什么意义?所以你可以写PFX_myfunc()而不是mypfx_myfunc()?我不明白这一点。

标签: c macros


【解决方案1】:

我不知道您为什么要这样做(可能是因为您想“模拟”命名空间),但假设您使用 C 语言,您可以使用以下代码实现它。

#define concat2(X, Y) X ## Y
#define concat(X, Y) concat2(X, Y)
#define pfx(x) concat(pfx_, x)

用法:

int pfx(sum)(int x, int y) {
    return x + y;
}

int main() {
    printf("%d\n", pfx(sum)(5,4));
}

注意:如果你想使用更多的宏处理能力(我不知道是不是你的情况)你应该访问P99

【讨论】:

    【解决方案2】:

    你为什么不改用namespace

    namespace mypfx
    {
        int call() {
             printf("teeeeeeeeest");
        }
    }
    
    int main(void)
    {
        mypfx::call();
    }
    

    【讨论】:

    • 这仅对 C++ 有效。
    • @Jabberwocky 另一个总是更喜欢 C++ 而不是 C 的原因! :)
    【解决方案3】:

    ## 运算符只允许您在另一个宏定义中连接两个字符串。

    但是这个:

    int PFX##_call()
    

    不是宏定义,所以会扩展成无效的C:

    int mypfx##_call()
    

    有效用法示例:

    #define FOO 1
    #define BAR 2
    #define FB FOO##BAR    // FB will expand to FOOBAR
                           // independently of the macros FOO and BAR
    
    #define BF FOO BAR     // BF will expand to 1 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多