一、#
在预处理时,将宏参数转换为字符串。
#define ToString(x) #x;
printf("%s\n", ToString(test));
预处理后,变为
printf("%s\n", "test");
二、##
预处理时,粘连宏参数。
#define fn(a, b) void a##b(int)
fn(test, 1);
预处理后,变为
void test1(void);
注意
当有##、#的宏定义时,宏中的参数若还是宏定义,此时该宏不会被展开。
#define MAX_NUM 7000
#define INT(x) #x
#define X 2
#define CON(x) int(x##x)
printf("%s", INT(MAX_NUM));
printf("%d", CON(X));
//宏定义展开
//printf("%s", "MAX_NUM");
//printf("%d", int(XX));
解决
#define MAX_NUM 7000
#define _INT(x) #x //转换宏
#define INT(x) _INT(x)
#define X 2
#define _CON(x) int(x##x)
#define CON(x) _CON(x) //转换宏
printf("%s", INT(MAX_NUM));
printf("%d", CON(X));
//宏定义展开
//printf("%s", "7000");
//printf("%d", 22);