【问题标题】:Token-pasting operator (##) is eating spaces in my C++ macro令牌粘贴运算符 (##) 正在占用我的 C++ 宏中的空格
【发布时间】:2012-02-18 03:11:10
【问题描述】:

我在使用以下宏时遇到问题,我发现令牌粘贴运算符 (##) 占用了 static 和返回类型之间的空间:

#define MY_FUNCTION(aReturnType) static ##aReturnType MyFunction() { }

所以预处理器正在转动这个:

MY_FUNCTION(bool)

进入这个:

staticbool MyFunction() { }

导致奇怪的编译错误。

我想出了在 static 关键字周围加上括号的想法:

// This works but is kind of weird
#define MY_FUNCTION(aReturnType) (static) ##aReturnType MyFunction() { }

有没有更好的解决方案?

【问题讨论】:

  • 吃空白是这个操作员的工作描述的一部分。

标签: c++ macros concatenation c-preprocessor


【解决方案1】:

应该怎么做?你告诉它把staticbool粘贴在一起。如果您不想要这样,而想要 static bool,那么不要将它们粘贴在一起

【讨论】:

    【解决方案2】:

    我认为您的问题是您不想在此处使用令牌粘贴。如果您将宏更改为

    #define MY_FUNCTION(aReturnType) static aReturnType MyFunction() { }
    

    那么如果你写

    MY_FUNCTION(bool)
    

    它会扩展成

    static bool MyFunction() { }
    

    我假设这是你想要做的,因为我看不到你试图将 aReturnType 参数粘贴到宏上。

    希望这会有所帮助!

    【讨论】:

    • 感谢您的解释。我对 C++ 宏有点生疏,忘记了我可以按原样使用宏参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2016-05-10
    • 2022-01-08
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多