ITPub博客

首页 > 应用开发 > > C语言中一些关于宏的适应技巧

C语言中一些关于宏的适应技巧

作者:sunrh 时间:2019-09-04 15:14:55 0 删除 编辑

宏定义中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__ 所在的位置。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2505/viewspace-3135267/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: python3
请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    91
  • 访问量
    714