#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/

10-14 06:16