来源:http://blog.chinaunix.net/uid-27210579-id-3293281.html
1.在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:
#define WARN_IF(EXP) \ do{ if (EXP) \ fprintf(stderr, "Warning: " #EXP "\n"); } \ while(0) //那么实际使用中会出现下面所示的替换过程: WARN_IF (divider == 0); //被替换为 do { if (divider == 0) fprintf(stderr, "Warning" "divider == 0" "\n"); } while(0);
2.##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量,比如:
#define LINK_MULTIPLE(a, b, c, d) a##_##b##_##c##_##d typedef struct _record_type LINK_MULTIPL (name, company, position, salary); //这里这个语句将展开为: typedef struct _record_type name_company_position_salary;