我正在预处理 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
I get
error: pasting formed 'APP_VERSION.', an invalid preprocessing token
error: pasting formed '.SVN_REVISION', an invalid preprocessing token
我见过这个问题但它实际上并没有给出答案; OP实际上并不需要连接令牌。我愿意。如何在不插入空格的情况下用点连接两个宏?
这个问题看起来是由预处理器的一个怪癖:连接运算符的参数不会首先扩展(或者......无论如何,规则很复杂),因此当前预处理器不会尝试连接1.0
and .
,它实际上是在尝试粘贴这个词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 预处理器编号可以有任意数量的点,即使 C 浮点常量可能只有一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)