Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15523
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 87
  • 用 户 组: 普通用户
  • 注册时间: 2017-05-12 16:45
文章分类

全部博文(7)

文章存档

2021年(1)

2017年(6)

我的朋友
最近访客

分类: C/C++

2017-05-27 20:33:52

宏定义中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

阅读(756) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~