#define DECLARE_TYPE(T) \
typedef struct \
{ \
float value; \
int scale; \
} ae_T##_t;
DECLARE_TYPE(Q25);
这应该创建类型ae_Q25_t
,但它不起作用。
如何改写?
答案 0 :(得分:5)
首先,自然应该是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
,那么您就是好的。