在ANSI C的任何⼀种实现中,存在两个不同的环境:
翻译环境和运行环境
(下面主要介绍翻译环境)
(这个图还比较生动)
预处理详情
1.预定义符号
printf("file:%s line:%d\n", __FILE__, __LINE__);
2.#define定义常量
基本语法:
#define name stuff
3. #define定义宏
宏的申明方式:
#define name( parament-list ) stuff
注意:
- 定义宏时一定不要吝啬括号!
不然就会因为优先级的原因得不到预期结果。 - 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。
- 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。
4.宏和函数的对比
5.#undef这条指令用于移除⼀个宏定义
6.条件编译
(调试性的代码,删除可惜,保留⼜碍事,所以我们可以选择性的编译)
常见的:
1.
#if 常量表达式//...
#endif
//常量表达式由预处理器求值。
如:
#define __DEBUG__ 1
#if __DEBUG__//..
#endif
2.多个分⽀的条件编译
#if 常量表达式//...
#elif 常量表达式//...
#else//...
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4.嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif
(如果不符合则在预处理阶段不会展示)
7.头文件包含
1.用" "
#include "filename"
先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件⼀样在标准位置查找头文件。
2.用<>
#include <filename.h>
查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。
8.嵌套文件包含
像这样,"test.h"被包含5次,那就实际被编译5次,如果重复包含,对编译的压力就比较大。
如何解决头文件被重复引入的问题?答案:条件编译
1.每个头文件的开头这样写:
#ifndef __TEST_H__
#define __TEST_H__
//头⽂件的内容
#endif //__TEST_H__
(第一次还没定义,所以符合条件进入下面步骤:先定义;
到第二次引用头文件则已经定义了所以不会执行以后的操作。
总之头文件只会引用一次。)
2.或者这样:
#pragma once