使用##的令牌连接不起作用?

#define DECLARE_TYPE(T) \ typedef struct \ { \ float value; \ int scale; \ } ae_T##_t; DECLARE_TYPE(Q25); 

这应该创建类型ae_Q25_t ,但它不起作用。

如何改写?

首先,自然应该是ae_##T##_t 。 请注意,C中的_字符不是标点符号,它是常规的“文本”字符(相反,例如: ,,,, space等)。 这意味着预处理器将ae_T视为单个连续不可分割的标记,而不是ae后跟_并且后跟T

其次,请记住,如果Q25本身就是一个宏而你想要它被替换,那么它将无法按预期工作。 要解决此问题,您需要一个双层宏定义

 #define DECLARE_TYPE_(T) \ typedef struct \ { \ float value; \ int scale; \ } ae_##T##_t; #define DECLARE_TYPE(T) DECLARE_TYPE_(T) 

但是如果你想让DECLARE_TYPE(Q25)总是特别解析为ae_Q25_t ,那么你就是好的。