GCC编译器 & 什么是宏?& 标识符和关键字

一.GCC是什么?

GCC是用于编译C语言和其它语言的开源软件。
全称是 GNU Compiler Collection,意思是GNU编译器集和。
支持多种操作系统和硬件平台。
Linux开发C/C++ 需要熟悉GCC.
VSCode就是通过调用GCC编译器来实现C/C++的编译的。
实际使用中:
使用gcc指令编译C代码。
使用g++指令编译c++代码。

二.GCC的作用

GCC的作用是将源码转换为可执行的文件,使之可以在计算机上运行。

三.GCC编译c文件的流程

预处理,编译,汇编和链接。

1.预处理阶段

预处理阶段:gcc会处理源代码中的预处理指令,如 "#include, #define, #ifdef等。
将宏(宏是什么下面有解释)展开,将头文件包含进来,生成一个.i文件。

如下,test.cpp中内容为:

#include <iostream>
using namespace std;
int main()
{
        cout<<"hello world"<<endl;
        return 0;
}

执行预处理命令,会把 iostream 展开,放在程序开头
在这里插入图片描述

2.编译阶段

编译阶段,gcc会将.i文件中的C语言代码转换为汇编语言代码,进行语法分析、类型检查、优化等操作,生成一个 .s 文件。

3.汇编阶段

汇编阶段,gcc会调用汇编器(as)将.s文件中的汇编语言代码转换为机器指令,生成一个 .o 文件。

4.链接阶段

链接阶段,gcc会调用链接器(ld)将 .o 文件和所需的库文件链接在一起,解决外部引用和地址分配等问题,生成一个可执行文件。

5.分步骤执行上面四个过程

假如文件为hello.c, 分步骤完成四个步骤时,需要使用不同的选项来指定每个步骤。

gcc -E hello.c -o hello.i #预处理
gcc -S hello.i -o hello.s #编译
gcc -c hello.s -o hello.o #汇编
gcc hello.o -o hello #链接

6.一次完成以上四个步骤

g++ hello.c -o hello

参考链接:https://blog.csdn.net/m0_57492987/article/details/132590920
参考视频:https://www.bilibili.com/video/BV1fy4y1b7TC?p=7&spm_id_from=pageDriver&vd_source=ebc47f36e62b223817b8e0edff181613

四.使用g++编译c++代码

1.预处理

# -E 表示对输入文件进行预处理,输入.cpp文件,得到.i文件
g++ -E test.cpp -o test.i  

2.编译

# -S 告诉g++ 在为c++代码产生汇编语言文件后停止编译
g++ -S test.i -o test.s

3.汇编

# -C 告诉g++ 把源代码编译为机器语言的目标代码 
g++ -C test.s -o test.o

4.链接

# # gcc会调用链接器(ld)将 .o 文件和所需的库文件链接在一起,解决外部引用和地址分配等问题,生成一个可执行文件。
# -o 编译选项来为将产生的可执行文件 指定 文件名
g++ test.o -o test

以上四步可以直接用一行命令代替:

g++ test.cpp -o test

五.gcc编译C++实战

cd /opt
madir code
cd code
vim test.cpp

vim界面一个tap是8个空格的宽度。设置为4。

:set ts=4
#include <iostream>
using namespace std;
int main()
{
        cout<<"hello world"<<endl;
        return 0;
}

按esc键然后输入如下命令保存

:wq

编译

g++ test.cpp -o test

输如ls 看是否编译成功
出现绿色的test,表示test是可执行文件。编译成功。

输入 ./test 运行可执行文件
在这里插入图片描述

补充

宏是什么?

宏在C语言中是一段"有名称的代码片段(使用#define定义)"。
在预处理阶段会把程序中的宏名替换为对应的代码片段,然后才进入编译阶段由编译器进行编译。
#define:宏定义
#undef:取消宏定义
#ifdef:判断宏是否定义

无参宏定义

最简单的宏定义时间用指定的标识符来代表代码片段,当宏定义有多行时,需要在行尾使用\来连接。
#define 宏名称  代码片段
 
// 如(多行时,行尾使用\作为续行符)
#define BUFFER_SIZE 1024
#define RANDOM (2.0*(double)rand() / RAND_MAX)
#define NUMBERS 1, \
                2, \
                3

带参数的宏

“形参列表”是用逗号隔开的多个标识符(也可以空,表示无参数),实参列表中的实参数量必须与宏定义中的形参数量一样多。

#define 宏名称( [形参列表] )  替换文本
// 如
#define GETCHAR() getc(stdin)
// 
#define MAX(a,b) ((a)>(b)?(a):(b))

参数要用括号括起,避免实参为表达式时出错,如

#define MULTIPLY(a, b) ((a)*(b))
MULTIPLY(1+2, 3+4)会预处理为((1+2)*(3+4)),若不加括号,则会变为1+2*3+4(意义全变)。

即使加括号,宏在一定情况下还是会产生二义性(要避免此类使用),如

#define SQUARE(a) ((a)*(a))
SQUARE(a++)会预处理为((a++)*(a++))(若a=3,则结果为3*4)。

C语言中宏简介:https://blog.csdn.net/alwaysrun/article/details/103206443

标识符是什么?

变量的名字、常量的名字、类的名字、函数的名字等。如 int a = 0; 这个是a就是标识符。

标识符不能使用关键字,标识符使用字母,数字和下划线;标识符不能以数字开头,只能以字母或者下划线开头;标识符区分大小写;

关键字

int a=0;  此时的int就是关键字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

computer_vision_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值