目录
VScode设置
要下载的插件:
卸载VScode的话就是哪装的哪删。
浅用gcc
预处理指令
使用gcc
语言编译过程
1. 预处理(Preprocessing)
2. 编译(Compilation)
3. 汇编(Assembly)
4. 链接(Linking)
VScode设置
其一开始如果没有进行额外的设置,默认编译C文件的时候只编译当前这个文件,即 ${file} ,这样会造成引用错误。
所以得修改参数:
把${file}注释掉,写成
"*.c"
这表示会编译当前项目目录下的所有.c文件。
保存后再运行文件就不会报错了。例如:
要下载的插件:
卸载VScode的话就是哪装的哪删。
浅用gcc
Linux 的C语言开发,一般选择 GCC 工具链进行编译。
在VScode里直接输入main+回车:
int main(int argc, char const *argv[])
{
/* code */
return 0;
}
其中,int argc是传入的参数个数, char const *argv[] 是接受传入的参数而形成的数组指针。
这两个参数可以先不用,删去就行。
预处理指令
在C语言中,#ifndef
是一个预处理指令,用于防止头文件被重复包含。它的全称是 "Not Defined If Not",即“如果未定义,则不包含”。这通常用于防止头文件被多次包含,这可能会引起编译错误或运行时错误。
这里是一个使用 #ifndef
的典型例子:
#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H
// 头文件的内容
#endif // HEADER_FILE_NAME_H
这段代码的工作原理如下:
#ifndef HEADER_FILE_NAME_H
检查是否已经定义了HEADER_FILE_NAME_H
这个宏。如果没有定义,编译器会继续执行下面的代码。#define HEADER_FILE_NAME_H
定义了HEADER_FILE_NAME_H
这个宏,确保如果再次遇到这个头文件,#ifndef
检查会失败,从而防止代码被再次包含。- 头文件的内容放置在
#ifndef
和#endif
之间。 #endif
表示#ifndef
指令的结束。
使用这种技术可以确保头文件中的内容只被编译一次,即使在多个源文件中包含了同一个头文件。这是一种常见的做法,用于避免全局变量和函数的重复定义问题。
使用gcc
gcc 所有要编译的文件 -o 编译完输出的程序名
这是gcc最简单的使用过程,省略了中间过程。
语言编译过程
语言编译过程是将源代码转换成机器可以执行的指令的一系列步骤。这个过程通常包括以下几个阶段:
1. 预处理(Preprocessing)
- 预处理器处理源代码文件中的预处理指令,如宏定义(`#define`)、文件包含(`#include`)等。
2. 编译(Compilation)
- 编译器将预处理后的源代码转换成中间代码或目标代码。对于C语言,这通常是一个汇编语言形式的中间代码。
3. 汇编(Assembly)
- 汇编器将汇编语言转换成机器码。这一步对于高级语言来说可能是编译器的一部分,直接生成机器码。
4. 链接(Linking)
- 链接器将编译后的各个模块(比如由多个源文件编译生成的多个目标文件)合并成一个可执行文件。链接器还会处理外部库和函数调用。
最终生成的程序占内存大小和使用的链接方式有关。
-static :该参数指示编译器进行静态链接,而不是默认的动态链接。使用这个参数,GCC会尝试将所有用到的库函数直接链接到最终生成的可执行文件中,包括C标准库(libc)、数学库(libm)和其他任何通过代码引用的外部库。
5. 优化(Optimization)
- 在编译和/或链接阶段,编译器可能会对代码进行优化以提高执行效率或减小生成的代码大小。
6. 代码生成(Code Generation)
- 编译器生成可执行的机器代码。
7. 加载(Loading)
- 加载器将编译生成的可执行文件加载到内存中,并为程序的执行准备环境。
8. 执行(Execution)
- 程序开始运行,CPU执行加载到内存中的机器代码。
这个过程可能会根据使用的编程语言和编译器的不同而有所变化。例如,一些语言(如Java和C#)使用中间字节码,需要一个虚拟机来执行这些字节码。另外,一些现代编译器可能会将多个阶段合并或以不同的顺序执行这些步骤。
对于不同的编程语言,编译过程可能还包括其他步骤,比如垃圾收集、类型检查等。
本文需要改进的部分:
- 语言编译过程那部分,每部分都要补充对应的gcc命令。