#define
定义标识符:
#define name stuff
#define 定义宏;
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或者定义宏;
#define name(parament-list) stuff
//其中的parament-list是一个由逗号隔开的符号表,它们可能出现在stuff中。
//注意:参数列表的左括号必须与name紧邻;
//如果两者之间有任何空白存在,参数列表就会解释为stuff的一部分。
#define替换规则
在程序中扩展 #define 定义符号和宏时,需要涉及几个步骤。
1、在调用宏时,首先对参数进行检查,看看是否包含任何#define定义的符号,如果是,它们首先被替换。
2、替换文本随后被插入到程序中原来文本的位置,对于宏,参数名被它们的值所替换。
3、最后,再次对结果文件进行扫面,看看它是否包含任何由#define定义的符号,如果是,就重复上诉处理过程。
4、宏参数和#define定义中可以出现其他#define定义的符号,但是对于宏,不能出现递归。
#的作用
##的作用
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
这样的连接必须产生一个合法的标识符,否则其结构就是未定义的。
在有些情况下宏是很方便的
比如在两个数中找到较大的一个。
#define MAX(a,b) ((a)>(b)?(a):(b))
//理由
1、用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。
所以宏比函数在程序的规模和速度方面更胜一筹。
2、更为重要的是函数的参数必须声明为特定的类型。
所以函数只能在类型合适的表达式上使用,反之这个宏可以适用于整型,长整型,浮点型,
宏是和类型无关的。
编程习惯:把宏名都大写,函数名不要全部都大写。
条件编译:
#ifdef , #if 和 #endif
1、
#if 常量表达式
//......
#endif
//常量表达式由预处理求值。
eg:
#define _DEBUG_ 1
#if _DEBUG_
//.....
#endif
2、多分支的条件编译
#if 常量表达式
//.....
#elif 常量表达式
//....
#else
//....
#endif
3、判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifdef symbol
4、嵌套指令
#if defined(os-unix)
#ifdef option1
//....
#endif
#ifdef option2
//...
#endif
#elif defined(os-msdos)
#ifdef option2
//....
#endif
#endif
到这里,看的那个C语言视频也差不多结束了,国庆假期看完,只不过到今天才差不多输入完毕。
后面就要多做练习,也已经开始学习数据结构了。