2

我正在预处理我的 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

我见过这个问题,但实际上并没有给出答案;OP 实际上并不需要连接标记。我愿意。如何在不插入空格的情况下将两个宏与它们之间的点连接起来?

4

1 回答 1

6

这个问题看起来是由预处理器的一个怪癖引起的:连接运算符的参数没有首先展开(或者......无论如何,规则很复杂),所以目前预处理器没有尝试连接1.0and .,它实际上是在尝试将单词粘贴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 浮点常量可能只有一个。

于 2013-02-10T23:45:47.840 回答