宏定义详解

来源:互联网 发布:标准差 知乎 编辑:程序博客网 时间:2024/05/29 19:35

宏定义不是C语言

 

1.宏定义是在预处理时候进行处理的,宏定义就是将引用宏名的地方用宏内容进行粘贴复制。

预处理时所进行的操作:1.将使用宏的地方进行替换2.将使用注释的地方用空格替换3.将头文件引入 其后所生成文件是纯C文件。3.确定代码的部分内容是否应该根据一些条件编译指令进行编译

 

2.宏函数和普通函数的优缺点:

1>宏函数替换之后,代码量可能会有所增加,其运行速度有所提高,而使用普通函数需要进行现场保护,现场恢复的操作,其代码在内存中只出现一次。

2>使用宏函数可能因为直接替换而导致运算的优先级发生改变,产生难以发觉的错误。

3>使用宏函数没有类型检查,适应于各种类型,即是缺点亦是优点,不安全。函数参数如果类型不同,就需要使用不同的函数,有严格的类型检查机制。  

4>使用宏函数可能会导致副作用,参数每次调用宏定义时,它们都将重新求值。由于多次求值,具有副作用的参数会带来隐蔽的错误,而函数在调用之前只求值一次,多次使用参数不会导致多次求值过程。

例如定义 #define MAX(X , Y)  (X)>(Y)?(X):(Y)    而在过程中引用x = MAX(i++ ,j++); 则此表达式的结果会自增两次。

 

3.断言:Evaluates an expression and when the result is FALSE, prints a diagnostic message and aborts the program.

void assert( int expression );  //如果表达式为假则发生中断,提示中断所在行  

4.宏的作用域限于本文件从定义开始至结尾处。

5.预处理器符号,__FILE__, __LINE__, __DATE__, __TIME__

 

6. #,## 串化,连接

# 把一个宏参数转化为一个字符串。#expression被翻译为 “expression

## 把位于它两边的符号连接成一个符号

例如 #define  VALUEATION( sum_number , value)  sum##sum_number = value

函数中引用 VALUEATION(6, 19); 则表达的意思为sum6 = 19;

 

7.宏名全部要大写,区别于变量。

 

8.条件编译:宏定义可以处理某个头文件被多个文件引用而造成的定义重复。通过宏定义一个变量,而在该工程中寻找是否定义了该变量,如果没有定义就定义该变量并且引用该文件。如果定义了该变量,则不会重复的引用,跳过这个文件。

#ifndef _VAR_

#define _VAR_

...

...

#endif

又如:

#if  ...

#elif ...

#eles ...

#endif

条件编译指令可以嵌套使用

 

0 0
原创粉丝点击