预处理
文件包含
当预处理器发现#include
指令时,会查看后面的文件名并把文件的内容包含到当前文件中
两种写法
尖括号:引用的是编译器的库路径里面的头文件。
双引号:引用的是程序目录中相对路径中的头文件,如果找不到再去上面的库里面找。
宏
参数批量替换到文本中,这种实现通常称为宏
#define 宏名(记号) 内容 #define PI 3.1415926
参数传递
#define MUL(x) x * x #define bb(i) printf("我是宏替换的:%d", i); int main() { printf("%d", MUL(9)); bb(10); }
系统宏
宏名称 | 含义 |
---|---|
_ _ DATE _ _ | 当前的日期,格式为类似May 30 2023 的字符串 |
_ _ TIME _ _ | 当前的时间,格式为类似 10:23:12 的字符串 |
_ _ FILE _ _ | 当前源代码文件的名称(含路径)的字符串 |
_ _ LINE _ _ | 当前所处的行号是多少就替换为多少,整数 |
条件编译
根据条件,选择性地对某些内容进行忽略,相当于if-else
语句
#ifdef PI //ifdef用于判断是否定义了符号PI,如果没有的话则处理以下的指令 #define M 666 #else //如果定义了符号PI,那么就处理这个分支的语句 #define M 777 #endif //最后需要以endif指令结束整个判断
#ifndef PI //ifndef 就是 if not define,跟ifdef反着的 #define M 666 #else #define M 777 #endif
#define M 666 #if M == 666 //若M等于666那么定义K = 999 #define K 999 #elif M == 777 //等同于else if语句 #define K 888 #else //else语句 #define K 000 #endif
程序编译
编译过程
GCC原名为GNU C语言编译器(GNU C Compiler)
gcc执行编译的过程
预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释去掉,处理include和define
编译(Compiling):处理好之后,就可以正式开始编译,首先会编译为汇编代码。
汇编(Assembling):接着就该将汇编代码编译为机器可以执行的二进制机器指令了,会得到一个二进制目标文件。
链接(Linking):最后需要将这个二进制目标文件与系统库和其他库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。
其中 -E
后面的是源文件名称,-o
是预处理后生成的文件名称
gcc -E test.c -o test.i #代码在经过预处理之后,#include中的内容都替换过来 gcc -S test.i -o test.s #编译为汇编程序 gcc -c test.s -o test.o gcc test.o -o test(test.exe) #链接
执行可执行文件
也可以一步到位
gcc test.c -o test
多文件处理
gcc main.c test.c -o main
Make和CMake构建
Make
当需要构建大量内容时,让谁先编译,谁后编译,Make构建工具就可以解决这种组织的问题
支持使用变量、逻辑判断等高级用法
编写Makefile
文件,有点Dockerfile的意思
只需要把需要执行的命令按照想要的顺序全部写到里面就可以了
targets : prerequisites command
targets:构建的目标,可以是一个普通的标签、文件名称等
prerequisites:前置条件,可以设定要求完成其他目标才能开始构建当前目标
command:构建需要执行的命令
main.exe: test.o main.o #目标1:构建最终的程序,要求完成下面两个目标(注意最终目标需要写在第一个) gcc test.o main.o -o main main.o: main.c #目标2:构建目标为main.o,前置要求必须有main.c文件 gcc -E main.c -o main.i gcc -S main.i -o main.s gcc -c main.s -o main.o test.o: test.c #目标3:同样的,要求必须有test.c文件才能开始 gcc -E test.c -o test.i gcc -S test.i -o test.s gcc -c test.s -o test.o
在控制台输入make命令,就开始编译
CMake
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够生成各种各样的makefile或者project文件
编写CMakeList.txt
文件
cmake_minimum_required(VERSION 3.22) project(untitled C) set(CMAKE_C_STANDARD 99) add_executable(untitled main.c test.c test.h)
第一行使用cmake_minimum_required来指定当前项目使用的CMake最低版本,如果使用的CMake程序低于此版本是无法构建的。
第二行project指定项目名称,名称随意,后面的是项目使用的语言,这里是C。
第三行set用于设定一些环境变量等,这里设定的是C 99标准。
第四行add_executable用于指定一个编译出来的可执行文件,这里名称为untitled,后面的都是需要编译的源文件(头文件可以不写)
输入cmake命令进行生成
cmake -S . -B test -G "MinGW Makefiles"
其中-S
后面的是源文件目录,这里.
表示当前目录,-B
后面是构建目录,一会构建的文件都在这里面存放,最后-G
是选择生成器(生成器有很多,甚至可以直接生成一个VS项目),这里需要生成Makefile,所以填写"MinGW Makefiles"