#define DECLARE_TYPE(T) \
typedef struct \
{ \
float value; \
int scale; \
} ae_T##_t;
DECLARE_TYPE(Q25);
这应该创建类型
ae_Q25_t
,但它不起作用。如何重写?
最佳答案
首先,自然应该是ae_##T##_t
。注意,C中的_
字符不是标点符号,它是一个常规的“文本”字符(与:
,,
,空格等相反)这意味着,预处理器将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
的问题,那么你就是个好人。关于c - 使用##的 token 串联不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41998251/