C中的#和##

    技术2026-01-07  10

    #是在宏定义中将参数进行字符串化的预处理特征

    ##是连接符

     

    ##的坑, 阻塞另一个宏的展开

    以下的写法是达不到预期效果的,编译会报错

    #define Join(x, y) x##y // 预期是 int x0; // 但实际是 int x__COUNTER__; // 因为##阻塞了__COUNTER__的展开 // 最终导致了 x0未定义报错 int Join(x, __COUNTER__); int main() { x0 = 10; return 0; }

    正确写法(需要中间在加一层宏定义)

    #define JOIN_FINAL(x, y) x##y #define JOIN_MID(x, y) JOIN_FINAL(x, y) #define JOIN(x) JOIN_MID(x, __COUNTER__) int JOIN(x); int main() { x0 = 10; return 0; }

    https://www.cnblogs.com/castor-xu/p/12822802.html

    Processed: 0.033, SQL: 9