【问题标题】:Variable name from macro argument来自宏参数的变量名
【发布时间】:2011-11-25 14:02:11
【问题描述】:

我想做这样的事情:

class SomeClass { };

GENERATE_FUNTION(SomeClass)

GENERATE_FUNCTION 宏我想定义一个函数,其名称将由宏参数确定。在这种情况下,我希望它定义一个函数func_SomeClass。怎么可能呢?

【问题讨论】:

    标签: c++ c-preprocessor


    【解决方案1】:
    #define GENERATE_FUNCTION(class_name) func_##class_name##
    

    【讨论】:

    • 最后的##是做什么的?
    • 显然使它根本不起作用:)(通过 mingw64 的 GCC)
    【解决方案2】:
    #define GENERATE_FUNCTION(Argument) void func_##Argument(){ ... }
    

    更多信息在这里: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

    【讨论】:

    • 请记住,如果您给它一个宏作为参数,则需要使用更多的预处理器才能使其工作。
    • @Mooing Duck:是的,在粘贴之前实际评估 Argument 的额外间接级别。然而,这似乎不是 OP 的情况。
    • 如果我不想要 func_ 部分怎么办?
    【解决方案3】:

    正如大家所说,您可以使用令牌粘贴在宏中构建名称,方法是将 ## 放置在需要将令牌连接在一起的位置。

    如果预处理器支持可变参数宏,你也可以包含返回类型和参数列表:

    #define GENERATE_FUNCTION(RET,NAM,...) RET func_##NAM(__VA_ARGS__)
    

    ..so,例如:

    GENERATE_FUNCTION(int,SomeClass,int val)
    

    ..将扩展为:

    int func_SomeClass(int val)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多