#define 预处理指令用来定义宏
宏定义用来给数字起名字
定义宏的时候,名称写在前面,所代表的数字写在后面
宏名称通常用大写英文字母表示
宏名称里不可以包含空格
用宏给数字起名字的时候不要使用赋值操作符
编译器在编译的时候将程序中所有宏名称替换成他所带表的数字
可以在编译命令中使用-D选项指定宏名称所代表的数字
比如:gcc -DPI=3.14f c12_预处理指令.c
只有在编译的时候才能确定的数字就应该用宏表示
宏也可以用来给一个计算公式起名字
计算公式中包含未知数字,用宏的参数表示这些位置数字
宏的参数不一定代表数字,所以没有类型;如果有多个参数,用,将其分开
宏不可以使用自己的存储区和函数进行数据传递
宏没有形式参数也没有返回值,所以不能保证其内部的优先级运算;
所以所有能当作数字使用的宏(能当数字使用的参数)必须写在括号里
不要把自增,自减的结果作为宏参数使用(计算结果,次数不确定)
能当作数字使用的宏必须写成表达式(宏没有存储区用来存放返回值)
宏的参数可以直接代表函数的存储区
宏函数的优缺点:
1.优点:
1》通用
2》程序会变快
3》参数不检查类型
2.缺点:
1》编译后代码通常会变大
2》不会检查类型
3》无法用一个指针指向宏
4》可能不止一次的计算他的参数 比如:POWER(x) ((x) * (x));POWER(++num)
#是一个宏操作符,可以把宏参数转换成字符串字面值
比如:#define STR(n) #n STR(2 + 4); 结果:即字符串 2 + 4
##也是一个宏操作符,他可以把一个代表标识符的宏参数和其他内容链接形成一个新的标识符
******条件编译*******
可以让编译器在编译的时候从几组语句中选择一组编译而忽略其他组
#ifdef/#ifndef...#else...#endif
以上结构可以根据一个宏名称是否被定义过从两组语句中选择一组编译
以上结构中最开始的预处理指令应该从开始的两个中选择一个
最前面的预处理指令后面应该写一个宏名称
#if:如果,判断宏名称是否为真;真,则执行;否则不执行
#ifdef:表示后面他的宏名称被定义过的话就编译前一组语句,否则编译后面一组语句
#ifndef:表示后面的宏名称没有被定义过;效果和#ifdef相反
#if...#elif(任意多次)...#else...#endif
这个结构也可以实现条件编译,可以根据任意逻辑表达式从多条语句中选择一条编译