__VA_ARGS__符号 可变参数列表,如果是多个参数,必须是最后一个参数,代表剩余的。 //例子__VA_ARGS__表示前面的...所有参数,前面再加个#表示字符串化即转为字符串形式#defineLOG(...) printf("log-->%s\n",#__VA_ARGS__)LOG("hello,world");//打印出 log-->"hello,world"LOG(123);//打印出 ...
说到这里,有必要提一下“##”连接符号的用法,“##”的作用是对token进行连接,上例中format,args,__VA_ARGS都可以看作是token,如果token为空,“##”则不进行连接,所以允许省略可变参数。对上述2个示例的改造: #defineLOG(format, ...)fprintf(stdout, format, ##__VA_ARGS__)#defineLOG(format, args.....
__VA_ARGS__符号 可变参数列表,如果是多个参数,必须是最后一个参数,代表剩余的。 AI检测代码解析 //例子__VA_ARGS__表示前面的...所有参数,前面再加个#表示字符串化即转为字符串形式 #define LOG(...) printf("log-->%s\n",#__VA_ARGS__) LOG("hello,world");//打印出 log-->...
通过把宏参数列表中最后的参数写成省略号(即,3个点…)来实现这一功能。这样,预定义宏 _ VAARGS 可用在替换部分中,表明省略号代表什么。例如,下面的定义: #define PR(…) printf(VA_ARGS) 假设稍后调用该宏: PR(“Howdy”); PR(“weight = %d, shipping = $%.2fn”, wt, sp); 对于第1次调用,_ V...
#defineCOUNT_VARARGS(...) GET_VARARGS(1, 2, __VA_ARGS__) 输出是唯一确定的,这种尝试也以失败告终,于是排除改变输出的可能性,只余下输入是可以改变的。继续尝试: #defineGET_VARARGS(N1, N2, ...) N2 #defineCOUNT_VARARGS(...) GET_VARARGS(__VA_ARGS__, 1, 2) ...
当调用有可选参数的宏时,预处理器会将所有可选参数连同分隔它们的逗号打包在一起作为一个参数。在替换文本中,标识符VA_ARGS对应一组前述打包的可选参数。标识符VA_ARGS只能用在宏定义时的替换文本中。 VA_ARGS的行为和其他宏参数一样,唯一不同的是,它会被调用时所用的参数列表中剩下的所有参数取代,而不是仅...
2.4 变参宏:...和__VA_ARGS__通过把宏参数列表中最后的参数写成省略号(...)来实现宏参数可变,而__VA_ARGS__则出现在替换部分中,表明省略号代表什么,如:结果为:注意:省略号只能代替最后的宏参数,像下面这样就是不行的 3. undef指令 #undef指令用于”取消“已定义的#define指令。假如有如下定义:...
一.define 简介 C 语言中,除了可以用#define定义一个标识符来表示一个常量,还可以用#define 定义函数,例如: //定义常量 #define MAX_VALUE 100 //定义整型变量MAX_VALUE值为100 #define USER_NAME "huge" //定义字符串变量USER_NAME值为"huge"
5、可变宏:…和 __VA_ARGS__ 我们经常要输出结果时要多次使用 prinf(“…”, …); 如果用上面例子#define SUM(a,b) printf(#a ” + “#b” = %d\n”,((a) + (b))),则格式比较固定,不能用于输出其他格式。 这时我们可以考虑用可变宏(Variadic Macros)。用法是: ...
(__VA_ARGS__) #define PRV2(x,...) printf(x,##__VA_ARGS__) //表示#define DEBUG std::cout<<"define debug" <<endl; #else std::cout<<"not define" <<endl; #endif //编译时,可以在makefile中添加宏定义选项进行传递 ,使用 -D参数 -DDEBUG 比如: gcc -DDUBG//可以直接在代码中使用...