宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
来源:互联网 发布:林弯弯淘宝店潮牌 编辑:程序博客网 时间:2024/05/18 09:49
先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等。例如:
[lch]:File:arch/arm/mach-omap2/board-omap3wscec-camera.c, Line:163, Function:beagle_cam_init,camera init!
3) __LINE__:宏在预编译时会替换成当前的行号
4) __FUNCTION__:宏在预编译时会替换成当前的函数名称
5)类似的宏还有 __TIME__,__STDC__, __TIMESTAMP__等,就完全当一个变量来使用即可。
6)宏连接符##:
举个例子:宏定义为#define XNAME(n) x##n,代码为:XNAME(4),则在预编译时,宏发现XNAME(4)与XNAME(n)匹配,则令 n 为 4,然后将右边的n的内容也变为4,然后将整个XNAME(4)替换为 x##n,亦即 x4,故 最终结果为 XNAME(4) 变为 x4.代码如下:
PS:编译过程:
1,扫描解析文件
2,预处理(宏在此时处理,该替换的文字会被替换)
3,对处理过的源代码进行汇编,输出汇编语言的代码(C语言的控制流程被处理)
4,编译为二进制目标文件
5,与程序库进行链接,输出最终的程序文件
(宏 和 C语言在不同的阶段处理执行)
参考资料:
1、宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
#define myprintf(...) printk("[lch]:File:%s, Line:%d, Function:%s," __VA_ARGS__, __FILE__, __LINE__ ,__FUNCTION__);此处的 #define 的作用是将 myprintf( )换成后面那一大串的内容,而括号内 ... 的内容原样抄写在 __VA_ARGS__ 的位置。最终输出如下:
[lch]:File:arch/arm/mach-omap2/board-omap3wscec-camera.c, Line:163, Function:beagle_cam_init,camera init!
解析:
1)__VA_ARGS__:总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,目前似乎只有gcc支持(VC从VC2005开始支持)。要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,而且右变量与左输出格式是一一对应的。所以在上面那个例子中, __VA_ARGS__只能是一些不含任何变量的字符串常量。因为上面的例子中若__VA_ARGS__含有变量,整个printf的输出与变量便不能一一对应,输出会出错。如果仅仅是替换函数名,可用如下方式,此时对__VA_ARGS__无任何特殊要求:#define myprintf(...) printk( __VA_ARGS__),在调试程序时可以这样用:
#ifndef LOG_NDEBUG_FUNCTION#define LOGFUNC(...) ((void)0)#else#define LOGFUNC(...) (printk(__VA_ARGS__))#endif2) __FILE__ :宏在预编译时会替换成当前的源文件名
3) __LINE__:宏在预编译时会替换成当前的行号
4) __FUNCTION__:宏在预编译时会替换成当前的函数名称
5)类似的宏还有 __TIME__,__STDC__, __TIMESTAMP__等,就完全当一个变量来使用即可。
6)宏连接符##:
举个例子:宏定义为#define XNAME(n) x##n,代码为:XNAME(4),则在预编译时,宏发现XNAME(4)与XNAME(n)匹配,则令 n 为 4,然后将右边的n的内容也变为4,然后将整个XNAME(4)替换为 x##n,亦即 x4,故 最终结果为 XNAME(4) 变为 x4.代码如下:
#include <stdio.h>#define XNAME(n) x##n#define PRINT_XN(n) printf("x" #n " = %d/n", x##n);int main(void){ int XNAME(1) = 14; // becomes int x1 = 14; int XNAME(2) = 20; // becomes int x2 = 20; PRINT_XN(1); // becomes printf("x1 = %d,", x1); PRINT_XN(2); // becomes printf("x2 = %d/n", x2); return 0;}输出为:x1 = 14, x2 = 20
PS:编译过程:
1,扫描解析文件
2,预处理(宏在此时处理,该替换的文字会被替换)
3,对处理过的源代码进行汇编,输出汇编语言的代码(C语言的控制流程被处理)
4,编译为二进制目标文件
5,与程序库进行链接,输出最终的程序文件
(宏 和 C语言在不同的阶段处理执行)
参考资料:
1、宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
0 0
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- C++笔记:宏的高级使用--##、__VA_ARGS__、__FILE__、__FUNCTION__
- 宏的使用__VA_ARGS__, __FILE__, __FUNCTION__,__TIME__等
- 宏的高级使用 ----#,##,__VA_ARGS__,__FILE__,__FUNCTION
- C++的__VA_ARGS__、__FILE__、__FUNCTION__、__LINE__、__DATE__、__TIME__宏
- --##,__VA_ARGS__, __FILE__, __FUNCTION__
- 先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等
- 可变参数的宏__VA_ARGS__ 及调试常用宏 __FILE__ 、__LINE__、__FUNCTION__
- __FILE__和__FUNCTION__的使用
- 利用__FILE__, __LINE__, __FUNCTION__等宏跟踪调试程序的运行
- log调试利器------__TIME__, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__搞起
- 嵌入式c语言面试题精选
- git 远程分支创建与推送
- eclipse中怎么配置jboss
- Thinking in BigData(一)前序
- 盘点2013:最优秀的HTML5&CSS3设计【多图】
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- 系统学习springMVC
- cubietruck 需要注意的地方!!!
- mysql时间和日期转换的一些例子
- LinkList和ArrayList的区别
- c#队列
- 你还在疯狂的下载资料,但很少真正的去阅读它吗?
- 前端开发必备 40款优秀CSS代码编写工具推荐
- git简介