预编译指令#define、#include、标准头文件结构小析

    技术2022-07-16  88

    1. #define编译预处理指令

    a. #define <名字> <值> b. 没有结尾的分号,因为不是C的语句 c. 名字必须要有一个是单词,值可以是各种东西 d. C语言中的编译器开始之前,编译预处理程序会把程序中的名字改为值(宏展开) i. 完全的文本替换 e. 宏 i. 如果一个宏的值里面有其他的宏的名字,也是会宏展开的 ii. 如果一个宏的值超过一行,最后一行之前的行末要加反斜杠\ f. 没有值的宏 i. #define _DEBUG ii. 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过 g. 预定义的宏 i. 这些宏在C程序中,不需要再进行定义,可以直接使用 ii. _STDC_、_LINE_、_FILE_、_DATE_、_TIME_ h. 带参数的宏(像函数) i. #define cube(x) ((x)*(x)*(x)) ii. 在C语言中,用绿色部分替换黄色部分 iii. 注意:为避免计算错误,需要将绿色部分用大括号括起来 1) 参数出现的地方需要括号 2) 整个值也需要括号 iv. 带多个参数的宏 1) #define MIN(a,b) ((a)>(b)?(b):(a))

    2. 一个.c文件是一个编译单元

    a. 编译器每次编译只处理一个编译单元--->生成.o文件 b. 很多个.c文件都被编译完成之后,由LINK将.o文件链接成一个可执行文件.exe

    3. 项目:

    a. Dev C++中新建一个项目,然后把几个源代码文件添加进入即可 b. 对于项目。Dev C++的编译会把一个项目中所有的源代码文件都编译然后链接 c. 对于VS, 是编译按钮只进行编译。然后build进行构建对整个项目做链接

    4. #include

    a. #include是一个编译预处理指令,和宏一样,在编译之前就预处理了 b. 功能是把那个文件的全部内容原封不动地插入到他所在的地方 c. 所以并不是所有的.c文件都需要#include d. #include有两种形式指出要插入的.h头文件 i. “”---表示要求编译器首先在当前目录寻找.h文件;如果没有那么到编译器指定的目录去寻找 ii. < >---表示要求编译器直接到编译器指定的目录寻找.h头文件 iii. #include并不是用来引入函数库的,引入函数库的工作是编译器干的;因此#include引入.h文件主要是用于引入所需要的函数的原型 iv. 库函数的原码在.lib文件中 e. 头文件 i. 在使用和定义这个函数的地方都应该#include这个头文件 ii. 这个头文件一般存放所有的对外公开的函数的原型和外部链接的静态变量 f. 重复声明 i. 在同一个编译单元里,同名的结构不可以被重复声明 ii. 如果在头文件里面有结构的声明,那么很难这个头文件不会在一个编译单元里被#include多次 iii. 所以需要“标准头文件结构”来避免重复声明结构 1) 标准头文件 2) 如下图所示 3) 其中的意思就是,先判断如果_LIST_HEAD_未定义,那么进行定义;否则直接跳过 4) 运用了条件编译和宏,保证这个头文件在一个编译单元中只会被#include一次 5) #pragma once也能起到相同的作用,但不是所有的编译器都会支持

    Processed: 0.011, SQL: 9