我正在预处理我的InfoPlist文件以包含我的修订号.我的标题看起来像这样:
#import "svn.h"
#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION.SVN_REVISION
Run Code Online (Sandbox Code Playgroud)
当我从程序中检查我的构建版本时,它就是1.0 . 123456.但如果我试试这个:
#import "svn.h"
#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION ## . ## SVN_REVISION
Run Code Online (Sandbox Code Playgroud)
我明白了
error: pasting formed 'APP_VERSION.', an invalid preprocessing token
error: pasting formed '.SVN_REVISION', an invalid preprocessing token
Run Code Online (Sandbox Code Playgroud)
我已经看过这个问题,但实际上并没有给出答案; OP实际上并不需要连接令牌.我做.如何在不插入空格的情况下将两个宏连接在它们之间?
这个问题看起来正在引起预处理器的怪癖:参数连接运算符不展开第一(或...无论什么,规则很复杂),所以目前的预处理器是不是想串连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
Run Code Online (Sandbox Code Playgroud)
你很幸运,C预处理器号码允许有你想要的任意数量的点,即使C浮点常量可能只有一个.
| 归档时间: |
|
| 查看次数: |
8093 次 |
| 最近记录: |