宏定义不是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
条件编译指令可以嵌套使用