使用##的令牌连接表示"不是有效的预处理令牌"

时间:2017-02-02 09:50:45

标签: c

以下代码给出了错误:

"粘贴" 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)

这可以修复吗?

1 个答案:

答案 0 :(得分:3)

因为$data['image'] = file_get_contents($_FILES['image']['tmp_name']); 不是单个令牌,而是两个令牌。 f32_Q31(本身就是一个标记。连接的结果必须是单个有效令牌。

如果您的意图是使用另一个宏的扩展来初始化(,则以下内容将执行:

name.value

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

正如 Sander De Dycker 指出的那样,您似乎也省略了前两个宏定义中的#define INIT_Q(N, name, val) \ name.value = f32_Q##N(val);

define