众所周知宏定义是在编译器预处理阶段进行的语法替换,发生在编译之前。
“##”是一个连接符号,用于把参数连在一起
“#”是“字符串化”的意思。出现在宏定义中的”#”是把跟在后面的参数转换成一个字符串
int v5 = 5;
#define f(n) printf("v "#n" = %d\n", v##n)
f(5); //输出:v 5 = 5
//define.c
#include <stdio.h>
#define FUNC_STOP stop
int player_stop()
{
return 0;
}
int player_start()
{
return 2;
}
int player_resume()
{
return 3;
}
int player_play_1x()
{
return 4;
}
typedef struct
{
int (*stop)();
int (*start)();
int (*resume)();
int (*play_1x)();
}PLAYER;
int main()
{
PLAYER player;
#define SET(x) \
printf("set %s\n", #x); \
player.x = player_##x
#define SSET(x) \
SET(x)
//SET(stop);
/*注意下面这行语句*/
SSET(FUNC_STOP);
SET(start);
SET(resume);
SET(play_1x);
printf("%d %d %d %d\n", player.stop(),
player.start(), player.resume(), player.play_1x());
return 0;
}