C语言可变参数宏

简介:

岁月不饶人,这年纪大了记忆力真是差了很多。今天写程序需要用到可变参数的宏,可是忘了怎么写,这倒也没什么,因为我一向是不记忆这些语法细节的,反正我知道程序里有个地方用到了这种技巧,但是可悲的是我忘了在哪个地方。搜索?语法都忘了搜个P呀。只好凭着印象,在自己负责的模块代码中找了一圈,花了十几分钟才终于在日志模块找到。唉,看来还是写下来比较好,这记忆力实在是不能相信了。

 

C语言中,可变参数宏的写法有如下几种形式:

#define myprint_1(fmt, ...)     printf(fmt, __VA_ARGS__)

#define myprint_2(fmt, ...)     printf(fmt, ##__VA_ARGS__)

#define myprint_3(fmt, arg...)  printf(fmt, ##arg)

 

int main(void)

{

    myprint_1("%s, %s, %d\r\n", __FILE__, __FUNCTION__, __LINE__);

    myprint_2("%s, %s, %d\r\n", __FILE__, __FUNCTION__, __LINE__);

    myprint_3("%s, %s, %d\r\n", __FILE__, __FUNCTION__, __LINE__);

    return 0;

}

 

注意:上面的三种形式在Windows+MinGW+GCC下编译通过,可以使用,但是在Tornado 2.2+VxWorks 6.5下,前面两种形式编译会出错,只有最后一种是可用的。

 

说实话,网上关于C语言可变参数宏的文章浩如烟海,为什么还要自己写一篇这种文档?那就是网上的文章虽然很多,但是良莠不齐,找到篇文章看半天后,还得自己验证一下,实在是耗时耗力,而自己记录下来的,是已经在程序中实际使用,经过验证的代码,其正确性、可用性当然毋庸置疑,看了一眼马上就能拿来用,省时省力,实在是个好办法。唯一的缺点就是要写文档,还要发表,有点麻烦,唉,那总也比到处翻代码强啊。






本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/771895,如需转载请自行联系原作者
目录
相关文章
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
104 0
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
163 6
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
152 5
|
6月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
92 5
|
10月前
|
编译器 程序员 C语言
C语言 宏
C语言 宏
92 5
|
11月前
|
Linux C语言
C语言宏IS_REACHABLE
C语言宏IS_REACHABLE
95 1
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
99 2
|
安全 编译器 程序员
C语言(16)----预处理中的宏以及预处理指令
C语言(16)----预处理中的宏以及预处理指令
105 2
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
98 1
|
12月前
|
安全 编译器 C语言
【C语言进阶篇】offsetof宏的介绍 及其实现
【C语言进阶篇】offsetof宏的介绍 及其实现