我的代码看起来像这样:
#define LIMB_SIZE 8
...
#define DATA_TYPE uint ## LIMB_SIZE ## _t
...
DATATYPE a;
...
相应的预处理输出如下所示:
uintLIMBSIZE_t a;
而我正期待
uint8_t a;
- 这是预期的行为吗?(即使删除了标记粘贴操作符之间的空格,它也能以相同的方式工作(
- 如果是,有什么替代方案可以让我从命令行使用define
LIMB_SIZE
?(假设LIMB_SIZE
将是8、16、32中的一个( - 如果没有,我缺少什么
我使用gcc -E file.c
来验证预处理的输出
处理类似对象的宏在很大程度上是:
- 用替换标记替换宏
- 应用
#
和##
运算符 - 处理新令牌中的宏
因此,当处理开始替换替换列表中的LIMB_SIZE
时,它处于步骤3。但是,步骤2已经将其转换为uintLIMB_SIZE_t
,因此不再存在单独的宏名称。
类似函数的宏增加了另一个步骤:
- 对于替换列表中未以
#
开头或与##
相邻的每个参数,用替换相应参数中宏的结果替换该参数。如果参数前面有#
,它将被"字符串化"参数所取代。如果参数与##
相邻,则它将被参数替换,而不替换其中的宏
这意味着,要在处理##
之前扩展LIMB_SIZE
,您需要:
- 它出现在类似函数的宏的参数中
- 该宏的对应参数不与
##
相邻
这需要使用两个类似函数的宏,所以你可以这样做:
#define LIMB_SIZE 8
#define Helper0(x) uint ## x ## _t // Concatenate x.
#define Helper1(x) Helper0(x) // Replace macros in x.
#define DATA_TYPE Helper1(LIMB_SIZE)
DATA_TYPE a;