如何在不插入空格的情况下将两个宏连接在它们之间?

时间:2013-01-18 09:45:06

标签: c-preprocessor

我正在预处理我的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实际上并不需要连接令牌。我做。如何在不插入空格的情况下将两个宏连接在它们之间?

1 个答案:

答案 0 :(得分:6)

问题看起来好像是由a quirk of the preprocessor引起的:连接运算符的参数不会先扩展(或者......无论如何,规则都很复杂),所以目前预处理器并没有尝试连接1.0.,它实际上是尝试将单词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浮点常量可能只有一个。