您的位置:首页 > 移动开发 > Objective-C

Objective-C中系统宏的用法总结

2016-09-06 13:42 399 查看
先说一下本文中会提到的内容:##,VA_ARGSFILELINEFUNCTION

宏变量:

先举一个例子,会用到上面这些宏:

#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__))
#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(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

转自:http://www.cnblogs.com/iosshare/p/5477673.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c