一、宏定义
宏定义的使用方法:
不带参数:
注意:
(1)宏名一般用大写;
(2)宏定义末尾不加分号;
(3)可以用
#undef命令终止宏定义的作用域;
(4)宏定义允许嵌套;
(5)宏定义不分配内存,变量定义分配内存。
重点:
(1) 不替换程序中字符串里的东西。
(2) 第一位置只能是合法的标识符(可以是关键字)。
(3) 第二位置如果有字符串,必须把""配对。
(4) 只替换与第一位置完全相同的
标识符。
带参数:
#define宏名(参数表) 字符串
注意:
(1)宏名和参数的括号间不能有空格
(2)宏替换只作替换,不做计算,不做表达式求解
关于(2)的解释:如
#define s(2,3) 2+3
则计算area=s(2,3)*2时,宏替换由于只做替换,因此替换为area=2+3*2,结果为area=8,是错误的。
因此使用宏定义表达式时,应用括号确定运算符的优先级。将上述定义改为#define s(2,3) (2+3)。
(1)#define
FUN(a) "a" 输入FUN(345)时结果仍为"a"
#用于把宏定义中的参数两端加上字符串的""
比如,这里
STR(my#name)会被替换成"my#name"
(3)
#define WIDE(str) L##str
如果有#defineFUN(a,b) vo ##a##b()
那么FUN(id ma,in)会被替换成void main()
文件包含有两种格式,分别是:#include "file" 和 #include <file>
这两格式的区别在于:
1.使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的"包含文件目录"(由用户在配置环境时设置)去找。
2.使用尖括号:直接到系统指定的"包含文件目录"去查找。
通常使用双引号比较保险
使用方法:
#ifndef <标识> //先测试x是否被宏定义过 即if not define
#define <标识>
程序段1 //如果x没有被宏定义过,定义x,并
编译程序段 1
#else
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1。
#end
if
//终止if
注意:
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。
标识的命名规则一般是头文件名全大写,前加下划线,并把文件名中的“.”也变成下划线,如:stdio.h变为_STDIO_H
如fa.h中class A{} fb.h中#include<fa.h> fb.h就会编译出错,因为class A重复定义了两次
fa.h ------------------------
#ifndef FAH #define FAH class A {}; #endif
采用条件编译之后,由于在fb,h中不满足ifndef条件,所以不再定义。这是c语言头文件中常用的办法。