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