可变参数宏的基础可以参考文档 http://blog.youkuaiyun.com/younkerjqb/article/details/53484330
先看一个例子
#define TEST(param3,param2,param1) param3 @ param2 @ param1
#define DEBUG_PRINTF(...) TEST(__VA_ARGS__)
DEBUG_PRINTF(a,*b,c)
DEBUG_PRINTF("abc i =%d, j = %d",i,j)
预处理展开后 $ gcc -E t.c
# 1 "t.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "mac_study.c"
a @ *b @ c
"abc i =%d, j = %d" @ i @ j
更进一步理解
#define TEST2(param2,param1) param2 param1
#define TEST(funname,...) int funname(TEST2(__VA_ARGS__))
#define DEBUG_PRINTF(...) TEST(__VA_ARGS__)
DEBUG_PRINTF(msgget,int,msgid)
预处理后的结果是
int msgget(int msgid)
结论:在gcc预处理中,可变参数宏其实是将逗号隔开的参数直接当做字符串来处理的,从左向右可以按顺序依次展开,也可以分次展开。