如果不小心引用了两次头文件,编译器就会处理两次,预编译文件中就会有两边头文件代码,可能会导致异常 #include"func.h" int main(){ #include"func.h" int arr[10]; } 预编译: 为了防止 这种情况,标准做法是将整个头文件放在条件语句中 #ifndef flag #define flag #define Total 0 #define PI 3.142 int ...
C预处理器(C Pre-Processor)也常简写为 CPP,是一个与 C 编译器独立的小程序,预编译器并不理解 C 语言语法,它仅是在程序源文件被编译之前,实现文本替换的功能。 目前预编译器巳集成到集成开发环境中,一般并没有执行预处理操作的选项,而包含在了编译操作中,即选择编译操作时,首先调用的是预处理器,处理源程序...
C 预处理器(C Preprocessor)简写为 CPP,又称预编译器,它并不是 C 编译器的组成部分,但是它是编译过程中一个单独的步骤。本质上,C 预处理器不过是一个文本替换工具而已,它们会指示编译器在实际的编译工作之前完成所需的预处理准备。 预处理器指令 C 语言中,所有的预处理器指令都是以#开头的。它必须是第一个...
编译过程又可以分成两个阶段:编译和汇编。 2.1编译 编译是指编译器读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码。 源文件的编译过程包含两个主要阶段: 第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。
处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。 处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文也可能包含其他文件。 删除所有的注释 添加行号和文件名标识,方便后续编译器生成调试信息等。
编译器对C程序的处理可以明确地分为两步。第一步由预编译器完成。以#开头的预编译指令可能会影响编译器设置或者进行文本替换。注意,预编译器变量(标识符)和正常的C变量是不一样的。预编译完成之后,编译器将不会看到任何预编译指令或标识符。下面介绍常见的预编译指令。 标准预编译指令 #define id text id表示定...
C语言对源程序处理的四个步骤:预处理、编译、汇编、链接。 预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。 这个过程并不对程序的源代码语法进行解析,但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。
预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译、布局控制和宏替换4种。 文件包含: #include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文。 条件编译: #if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进行编译时进...
编译(compile) 和 链接(Link) 其中,我们提到过对“预编译”和“编译”阶段来说,每个C源文件都是独立参与编译的,我们一般称为“编译单元(Compilation Unit)”——简单来说,就是在这两个编译阶段,每个C源文件不光“彼此不知对方的存在”,而且也是“老死不相往来”的。记住这一规则,这是理解后续内容的关键。
如果你想进一步确定编译器使用的标准版本是C99还是C89可以使用__STDC__VERSION__,C99(199901) printf("%d\n", __STDC_VERSION__); 输出: 199901 对于#define 预处理器一般只对同一行定义有效,但如果加上反斜杠,也能一直读取下去 #define err(flag) \ ...