【问题标题】:How do I concatenate two macros with a dot between them without inserting spaces?如何在不插入空格的情况下将两个宏与它们之间的点连接起来?
【发布时间】:2013-01-18 09:45:06
【问题描述】:

我正在预处理我的 InfoPlist 文件以包含我的修订号。我的标题如下所示:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION.SVN_REVISION

当我从程序中检查我的构建版本时,它是1.0 . 123456。但如果我试试这个:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION ## . ## SVN_REVISION

我明白了

error: pasting formed 'APP_VERSION.', an invalid preprocessing token
error: pasting formed '.SVN_REVISION', an invalid preprocessing token

我见过this question,但它实际上并没有给出答案; OP 实际上并不需要连接标记。我愿意。如何在不插入空格的情况下连接两个带有点的宏?

【问题讨论】:

    标签: c-preprocessor


    【解决方案1】:

    这个问题看起来是由a quirk of the preprocessor引起的:连接运算符的参数没有首先展开(或者......无论如何,规则很复杂),所以目前预处理器没有尝试连接@ 987654323@ 和 .,它实际上是在尝试将单词 APP_VERSION 粘贴到输出令牌中。在 C 中,单词中没有点,因此这不是一个有效的标记,因此会出现错误。

    您通常可以通过几层包装宏来强制解决问题,以便将串联操作隐藏在至少两个替换之后,如下所示:

    #define APP_VERSION 1.0
    #define SVN_REVISION 123456
    
    #define M_CONC(A, B) M_CONC_(A, B)
    #define M_CONC_(A, B) A##B
    
    #define APP_BUILD M_CONC(APP_VERSION, M_CONC(.,SVN_REVISION))
    
    APP_BUILD    // Expands to the single token 1.0.123456
    

    你很幸运有一个 C 预处理器编号 is allowed to have as many dots as you like,即使 C 浮点常量可能只有一个。

    【讨论】:

    • 它在浮动常量上显示错误为无效后缀 '.123456'
    • @Abhishek 你是在编译还是只是预处理?主要的 C 语言无法处理多点数字,因此您需要确保它们以字符串结尾或以其他方式隐藏。
    猜你喜欢
    • 2011-03-26
    • 2016-05-27
    • 2017-06-06
    • 2023-04-11
    • 2021-02-05
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多