宏定义中do{}while(0)的用法
1.空的宏定义避免warning:
#define foo() do{}while(0)
2.存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。
3.如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:
#define foo(x) \
action1(); \
action2();
在以下情况下:
if(NULL == pPointer)
foo();
就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。
使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低
#define是大家都常见的宏定义方法,用法结构为:
#define PI 3.1415926
#define ADD(x,y) ((x)+(y))
#undef是从该处取消前面已经定义的宏,如果标识符当前没有被定义为一个宏名称,则忽略该指令:
#undef PI
#ifdef和#ifndef 含义相反,前者含义为如果定义了该宏,则编译相应代码;后者则为如果没有定义该宏,则编译相应代码。通用结构为:
#define DEBUG
#ifdef DEBUG
cout << "This is a debug message." << endl;
#endif
// prints : This is a debug message.
#ifndef DEBUG
cout << "This is a debug message." << endl;
#endif
// prints nothing
#line命令是用于更改__LINE__ 和 __FILE__变量的值。__FILE__和__LINE__描述被读取的当前文件和所在行数。
#include
using namespace std;
int main()
{
#line 10 "main.cpp"
cout << __FILE__ << " " << __LINE__ << endl;
}
// prints : main.cpp 10
#error会直接导致程序停止编译并输出指定的错误信息:
#ifndef VERSION
#error Version number not specified.
#endif
宏##__VA_ARGS__的意义
__VA_ARGS__:总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。
引用参考的文章如下:
http://idas643.blog.163.com/blog/static/1671048382015461049289/
http://www.voidcn.com/blog/earbao/article/p-6254938.html
http://cvrs.whu.edu.cn/blogs/?p=231
阅读(794) | 评论(0) | 转发(0) |