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

Sim*_*mon 2 c-preprocessor

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

Leu*_*nko 6

这个问题看起来正在引起预处理器的怪癖:参数连接运算符不展开第一(或...无论什么,规则很复杂),所以目前的预处理器是不是想串连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浮点常量可能只有一个.