在看linux内核kernel.h里面看到这样一个语句:
#define pr_err(fmt, ...) \
eprintf(0, pr_fmt(fmt), ##__VA_ARGS__)
看不懂,于是百度了一下,感谢度娘和博主!
转载于:http://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html
http://www.cnblogs.com/zhujudah/archive/2012/03/22/2411240.html
首先,#define 是常见的预编译命令,但是假如#放在其它地方用有些巧妙的地方。
1,先来看一个例子:
#include<stdio.h> #include <stdlib.h> #define Func1(x) printf("the square of " #x " is %d.\n",(x)*(x)) int main(void) { int aa=30; Func1(aa); Func1(30); system("pause"); return 0; }
输出:
the square of aa is 900.
the square of 30 is 900.
分析》:#用在预编译语句里面可以把预编译函数的变量直接格式成字符串;注意,不能直接在其它非预编译函数直接使用#aa的形式,假如main函数里面出现printf("the square of " #x " is %d.\n",(x)*(x))是不能通过编译的.
2,
#include<stdio.h> #include <stdlib.h> #define Func3(a) printf("the square of " #a " is %d.\n",b##a) int main(void) { int m=30; int bm=900; Func3(m); //展开后相当于 printf("the square of m is %d.\n",bm); system("pause"); return 0; }
输出:
the square of m is 900.
分析》:## 是宏连接符,作变量链接,Func(a)里面有b##a,也就是说直接连接成b‘a’,Func3(m)对应bm,由于bm在main里面有定义,所以可以打印出来。
3,##__VA_ARGS__这里的‘##’有特殊作用,
__VA_ARGS__是可变参数宏,用法如下:
#define Debug(...) printf(__VA_ARGS__)
使用的时候只需要:
Debug(
"Y = %d\n"
, y);
此时编译器会自动替换成printf("Y = %d\n"
, y
");
对于##__VA_ARGS__的‘##’符号的用法,
例如:#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
假如可变参数宏为空的时候,”“##”的作用就是让编译器忽略前面一个逗号,不然编译器会报错。
相关推荐
调试信息的输出方法有很多种, 例如直接用printf, 或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进程则一般是使用syslog将调试信息输出到日志文件中等等
直接使用VA_ARGS_COUNT()宏以int返回传递给它的参数数量。 printf("There are %i arguments.\n", VA_ARGS_COUNT(1, "two", 3.0)); 计数功能参数 就其本身而言,这不是很有用。 当在其他可变参数宏中使用VA_ARGS_...
cpp代码-C和C++奇怪内容 ## # __VA_ARGS__和... (可变参数) 宽字符
# ## VA ARGS 可变参数函数
#define debug(M, ...) fprintf(stderr, "DEBUG %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__) //牛逼 #endif #define clean_errno() (errno == 0 ? "None" : strerror(errno)) #define log_err(M, ...) ...
#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, "(>_<)", format, ##__VA_ARGS__) #define LOGI(format, ...) __android_log_print(ANDROID_LOG_INFO, "(=_=)", format, ##__VA_ARGS__) #else #...
解决数据结构中参数不确定是如何传参数的问题
C语言变参函数设计
#,##,可变参数宏 ...和_ _VA_ARGS_ _的用法
主要介绍了python命令行解析之parse_known_args()函数和parse_args()使用介绍,需要的朋友可以参考下
本文实例讲述了PHP函数func_num_args用法。分享给大家供大家参考,具体如下: function foo() { $numargs = func_num_args();//返回这个函数所含的参数 echo "Num fo argumets : $numargs \n"; $arr=func_...
#define LOGDEBUG(filename, ...) WriteLog(filename, "DEBUG", 4, __func__, __FILE__, __VA_ARGS__, ""); #define LOGINFO(filename, ...) WriteLog(filename, "INFO", 3, __func__, __FILE__, __VA_ARGS__, "")...
func_num_args( )可以用来结合func_get_arg( )和func_get_args( )来允许使用者定义的函式接受variable-length参数列表。其中,func_get_arg( )从参数列表返回项目,其语法:int func_get_arg (int arg_num),传回...
我们再看一下PHP的这三个函数[unc_get_arg(),func_get_args(),func_num_args()]的区别,我们先看一下,下面的实例代码
D:\Program Files\emqx\bin>set args_file=-args_file "D:\Program Files\emqx\etc\vm.args" D:\Program Files\emqx\bin>set sys_config=-config "D:\Program Files\emqx\etc\sys.config" D:\Program Files\emqx\bin...
学习php的朋友都知道php本身是没有函数重载这一说的,更没说像java,c那样使用方法,但如果我们深入了解一下会发现可以在php中使用func_get_args()和func_num_args()函数实现函数重载,下面来举两个函数重载例子....
C语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言头文件 VARARGSC语言...