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

一.GCC是什么?

python 复制代码
GCC是用于编译C语言和其它语言的开源软件。
全称是 GNU Compiler Collection,意思是GNU编译器集和。
支持多种操作系统和硬件平台。

二.GCC的作用

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

三.GCC编译c文件的流程

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

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

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

链接阶段,gcc会调用链接器(ld)将 .o 文件和所需的库文件链接在一起,解决外部引用和地址分配等问题,生成一个可执行文件。
python 复制代码
 gcc可以一次性完成这四个步骤,也可以分步骤完成。一次性完成时,只需要在命令行中输入:<filename.c> 是要编译的C语言源代码文件名,<outputfilename> 是生成的可执行文件名。
python 复制代码
gcc <filename.c> -o <outputfilename>

分步骤完成时,需要使用不同的选项来指定每个步骤。

python 复制代码
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 #链接

参考链接:https://blog.csdn.net/m0_57492987/article/details/132590920

补充

宏是什么?

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

#define:宏定义

#undef:取消宏定义

#ifdef:判断宏是否定义

无参宏定义

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

带参数的宏

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

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

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

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

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

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

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

标识符是什么?

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

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

关键字

python 复制代码
int a=0;  此时的int就是关键字。
相关推荐
_OP_CHEN13 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
_OP_CHEN2 天前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
_OP_CHEN2 天前
【Linux系统编程】(二十七)手撕动静态库原理与实战:从底层逻辑到代码落地
linux·操作系统·动态库·静态库·c/c++·库的原理与制作
_OP_CHEN2 天前
【算法基础篇】(五十五)卡特兰数封神之路:从括号匹配到二叉树构造,组合数学的万能钥匙!
算法·蓝桥杯·c/c++·组合数学·卡特兰数·算法竞赛·acm/icpc
_OP_CHEN3 天前
【Linux系统编程】(二十六)一文吃透 Ext 系列文件系统软硬链接:原理、实战与底层逻辑揭秘
linux·操作系统·文件系统·c/c++·硬链接·软链接·ext2文件系统
_OP_CHEN4 天前
【算法基础篇】(五十四)解析错排问题:从信封错位到编程实战,一次性搞懂排列组合中的 “反常识” 难题!
算法·蓝桥杯·c/c++·组合计数·算法竞赛·acm/icpc·错排问题
_OP_CHEN4 天前
【Linux系统编程】(二十五)从路径到挂载:Ext 系列文件系统的 “导航” 与 “整合” 核心揭秘
linux·操作系统·文件系统·c/c++·ext2文件系统·路径解析·挂载分区
_OP_CHEN5 天前
【算法基础篇】(五十三)隔板法指南:从 “分球入盒” 到不定方程,组合计数的万能解题模板
算法·蓝桥杯·c/c++·组合数学·隔板法·acm/icpc
_OP_CHEN10 天前
【Linux系统编程】(二十四)深入 Ext2 块组内部:inode、数据块与目录的底层工作机制
linux·操作系统·文件系统·c/c++·inode·块组·数据块映射
dvlinker11 天前
C/C++编程开发工具及实用软件推荐
ide·vscode·visual studio·qt creator·c/c++·source insight·编程工具