c语言的预处理和编译

预处理

文件包含

当预处理器发现#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执行编译的过程

  1. 预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释去掉,处理include和define

  2. 编译(Compiling):处理好之后,就可以正式开始编译,首先会编译为汇编代码。

  3. 汇编(Assembling):接着就该将汇编代码编译为机器可以执行的二进制机器指令了,会得到一个二进制目标文件。

  4. 链接(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的意思

c语言的预处理和编译_第1张图片

 

只需要把需要执行的命令按照想要的顺序全部写到里面就可以了

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命令,就开始编译

c语言的预处理和编译_第2张图片

 

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"

你可能感兴趣的:(数据结构和算法,c语言,开发语言)