【问题标题】:Create object-like macro from concatenation of token and macro从标记和宏的串联创建类似对象的宏
【发布时间】:2015-04-23 19:54:26
【问题描述】:

我想从令牌和宏的串联中创建一个类似对象的宏。我有这个代码:

#define alfa vita
/* Code below is broken. */
#define gamma delta##alfa
gamma

gamma 被替换为 deltaalfa。我想用deltavita 替换它。我该怎么做?

我不希望 gamma 成为类似函数的宏。


What are the applications of the ## preprocessor operator and gotchas to consider?
这个问题非常广泛。它没有关注我的问题,第一个答案也没有解决它。

【问题讨论】:

    标签: c concatenation c-preprocessor


    【解决方案1】:

    您必须像这样执行双重宏扩展:

    #define alfa vita
    
    #define concat2(a,b) a ## b
    #define concat(a,b) concat2(a,b)
    #define gamma concat(delta, alfa)
    
    gamma
    

    字符串化 (#) 和标记粘贴 (##) 运算符的操作数不会首先展开。作为一种特殊情况,函数式宏的扩展首先会扩展参数除非它们是### 运算符的操作数,然后将它们代入宏体,然后重新扫描替换。

    上面的双扩展方法有效,因为concat() 宏的参数不是##(或#)的操作数。因此,它们在被替换到该宏的主体之前被扩展以产生

    concat2(delta, vita)
    

    重新扫描后,进一步扩展为

    delta ## vita
    

    (无论符号 vita 的任何宏定义如何),然后将其粘贴到单个标记中以产生结果。

    【讨论】:

    • 这适用于简单的情况。在我更大的代码中它没有。 gamma 扩展为 concat(delta, vita) ...
    • 您遗漏了concat() 宏的定义,或者在其正文中拼错了concat2
    • 我在#define gamma 之后添加了#undef concat。现在它起作用了。谢谢。
    猜你喜欢
    • 2012-05-14
    • 2023-01-14
    • 2010-12-08
    • 2014-06-15
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多