c-如何在标记粘贴运算符中使用符号常量的值

  • 本文关键字:符号常量 运算符 c gcc
  • 更新时间 :
  • 英文 :


我的代码看起来像这样:

#define LIMB_SIZE 8
...
#define DATA_TYPE uint ## LIMB_SIZE ## _t
...
DATATYPE a;
...

相应的预处理输出如下所示:

uintLIMBSIZE_t a;

而我正期待

uint8_t a;
  • 这是预期的行为吗?(即使删除了标记粘贴操作符之间的空格,它也能以相同的方式工作(
  • 如果是,有什么替代方案可以让我从命令行使用defineLIMB_SIZE?(假设LIMB_SIZE将是8、16、32中的一个(
  • 如果没有,我缺少什么

我使用gcc -E file.c来验证预处理的输出

处理类似对象的宏在很大程度上是:

  1. 用替换标记替换宏
  2. 应用###运算符
  3. 处理新令牌中的宏

因此,当处理开始替换替换列表中的LIMB_SIZE时,它处于步骤3。但是,步骤2已经将其转换为uintLIMB_SIZE_t,因此不再存在单独的宏名称。

类似函数的宏增加了另一个步骤:

  1. 对于替换列表中未以#开头或与##相邻的每个参数,用替换相应参数中宏的结果替换该参数。如果参数前面有#,它将被"字符串化"参数所取代。如果参数与##相邻,则它将被参数替换,而不替换其中的宏

这意味着,要在处理##之前扩展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;

最新更新