先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __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:, 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__))
#endif

2) __FILE__ :宏在预编译时会替换成当前的源文件名
3) __LINE__:宏在预编译时会替换成当前的行号
4) __FUNCTION__:宏在预编译时会替换成当前的函数名称
5)类似的宏还有 __TIME__,__STDC__, __TIMESTAMP__等,就完全当一个变量来使用即可。

宏连接符##:
举个例子:宏定义为#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() = ; // becomes int x1 = 14;
int XNAME() = ; // becomes int x2 = 20;
PRINT_XN(); // becomes printf("x1 = %d,", x1);
PRINT_XN(); // becomes printf("x2 = %d/n", x2);
return ;
}

输出为:x1 = 14, x2 = 20

最新文章

  1. python mock基本使用
  2. Android保持屏幕常亮的方法
  3. 关于在win7内集成usb3.0驱动。
  4. 二十一、contextMap中放的常用数据
  5. webvector将html转为svg或者png图片的工具
  6. httpClient 入门实例
  7. hbase使用-java操作
  8. pscp实现Windows 和Linux 文件互相传输
  9. Redis 实战篇之搭建集群
  10. Unity游戏开发图片纹理压缩方案
  11. 【mongo】登陆报错
  12. Spring注解之@Import
  13. 【API设计】RESTful API 设计指南
  14. sql结合通配符来自定义转义字符
  15. 统计oracle表中字段的个数
  16. CSS布局奇淫技巧之--各种居中&lt;转&gt;
  17. 【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)
  18. Excel信息提取之二
  19. Socket通讯介绍
  20. PHP 数字转汉字函数

热门文章

  1. Lua语法
  2. 【DOM】2.闭包
  3. Bzoj 4556: [Tjoi2016&amp;Heoi2016]字符串
  4. 【原创】lua的module的一些点
  5. BNUOJ-29364 Bread Sorting 水题
  6. HDU-1007 Quoit Design 平面最近点对
  7. ALM11测试计划页面图解1
  8. 笔记-iOS 视图控制器转场详解(上)
  9. C#.NET数据库访问类DBHelper
  10. BZOJ 2241: [SDOI2011]打地鼠 暴力