使用##的令牌连接给出“不是有效的预处理令牌”
以下代码给出了错误:
“粘贴”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)