预定义符号
#define
#define宏定义,大多数用处是简化代码
#define MAX 1000 #define reg register //为 register这个关键字,创建一个简短的名字 #define do_forever for(;;) //用更形象的符号来替换一种实现 #define CASE break;case //在写case语句的时候自动把 break写上。 // 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。 #define DEBUG_PRINT printf("file:%s\tline:%d\t \ date:%s\ttime:%s\n" ,\ __FILE__,__LINE__ , \ __DATE__,__TIME__ )
使用#define时后面不需要加分号,预编译的时候系统会默认添加
宏的申明
下面是宏的申明方式:
#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。
注意:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先
被替换。
2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上
述处理过程。
define只是替换不涉及类型
#define MUL(a,b) a*b int main() { int a = 5; int b = 10; int d = MUL(a, b); //预处理后等于 int d = a * b; int f = MUL(a + 5, b); //预处理后等于 int f = a + 5 * b; return 0; } //所以正确写法应该为#define MUL(a,b) ((a)*(b)) //以防优先级造成影响
宏和函数对比
1,宏和类型无关。
2. 宏是没法调试的。
3. 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。
4. 宏可能会带来运算符优先级的问题,导致程容易出现错。