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

时间:2017-02-02 09:15:38

标签: c

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

DECLARE_TYPE(Q25);

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

如何改写?

1 个答案:

答案 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,那么您就是好的。