使用##的令牌连接给出“不是有效的预处理令牌”

以下代码给出了错误:

“粘贴”f32_Q31“和”(“不提供有效的预处理标记”

#define INIT_Q(N, name, val) \ name.value = f32_Q##N##(val); #define f32_Q31(x) f32_Q(31,x) INIT_Q31(name, val) INIT_Q(31, name, val) INIT_Q25(name, val) INIT_Q(25, name, val) 

这可以修复吗?

因为f32_Q31(不是单个令牌,而是两个。 (它本身就是一个令牌。连接的结果必须是一个有效的令牌。

如果您的意图是使用另一个宏的扩展来初始化name.value ,则以下操作将:

 #define INIT_Q(N, name, val) \ name.value = f32_Q##N(val); 

宏名称必须是有效的标记,而不是整个表达式。


正如Sander De Dycker指出的那样,您似乎也省略了最后两个宏定义中的定义:

 #define INIT_Q31(name, val) INIT_Q(31, name, val) #define INIT_Q25(name, val) INIT_Q(25, name, val)