#、##和__VA_ARGS__】的更多相关文章

— Built-in Function: void * __builtin_return_address (unsigned int level) This function returns the return address of the current function, or of one of its callers. The level argument is number of frames to scan up the call stack. A value of 0 yield…
__VA_ARGS__ 是一个可变参数的宏(gcc支持).实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点).这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串.加##用来支持0个可变参数的情况. 测试代码: #include<stdio.h> #define PRINT_DBG(debug, ...)\ {\ if(debug) {\ fprintf(stderr, "%s %s [%d]: ", __FILE__, _…
在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如:#define pr_debug(fmt,arg...) \printk(KERN_DEBUG fmt,##arg) 用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如: void printf(const char* format, …); 直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中. C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variad…
#define qWiFiDebug(format, ...) qDebug("[WiFi] "format" File:%s, Line:%d, Function:%s", ##__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__); __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).宏前面加上##的作用在于,当可变参数…
自定义调试信息的输出 调试信息的输出方法有很多种,  例如直接用printf,  或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一般是使用syslog将调试信息输出到日志文件中等等... 使用标准的方法打印调试信息有时候不是很方便,  例如Qt编程, 在调试已有的代码时, 我想在打印调试信息的地方, 把代码位置也打印出来以方便定位错误, 或者需要在调试信息前面加一个前辍, 好方便在调试信息太多的时候可以用grep过滤一下, 仅…
[转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等 http://blog.csdn.net/yiya1989/article/details/7849588 先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等 宏变量: 先举一个例子,会用到上面这些宏: #define myprintf(...) printk("[lch]:File:%s, Line:%d, Func…
class Test { public: template<class T> Test& operator,(T t) { //具体操作 return *this; } } Test test; #define TEST(...) test,__VA_ARGS__ 按上述操作,因为__VA_ARGS__宏每次展开后为逗号参数列表.如 TEST(1,2,3)展开为test,1,2,3. 这时test因为重载了逗号操作符,每次逗号操作后又返回test的引用,就可以依次处理1,2,3这三个入…
一 .__VA_ARGS__ P454 所讲printf()这些输出函数的参数是可变的,在调试程序时,可能希望定义参数为可变的输出函数, 那么可变参数宏会是一个选择,例如: #define DEBUG(X, ...) printf("Message", #X,":" __VA_ARGS__) 其中,...表示参数可变,__VA_ARGS__在预处理中为实际的参数集所替换部分. //variadic.c----可变宏 #define DBG(format, ...)…
在GNU C中,宏可以接受可变数目的参数,就象函数一样 可以把__VA_ARGS__看成是将...赋值给该宏 //注意这里不能在函数中调用abc() #include <stdio.h> #include <stdarg.h> #define ABC(...) printf(__VA_ARGS__) /*void abc(...) { //printf(__VA_ARGS__); }*/ int main() { ABC("%s\n","hello&q…
在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择. 在C99中规定宏也可以像函数一样带可变的参数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__) 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)…