gcc编译C语言程序的步骤

本文详细介绍了gcc编译C语言程序的四个步骤:预处理、编译、汇编和链接。预处理阶段涉及包含头文件、宏定义及条件编译。同时,文章也提及了在多文件编程中的编译流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gcc编译C语言程序的步骤:

1.预处理

-E    进行预处理工作
	去掉注释内容 ,进行宏替换和头文件导入或者条件编译等 
	注:不会自动生成文件 
-o  可以指定生成的目标文件  .i

2.编译

-S    检查语法错误  生成汇编程序
	检查源代码或者经过预处理之后代码的语法错误,生成汇编程序   .s  

3.汇编

-c
	 把汇编代码汇编成目标文件(二进制  .o

4.链接

 链接一个或者多个目标文件生成可执行程序   默认生成a.out
 链接函数调用

语法错误检查:在编译阶段
函数调用检查:在链接阶段

预处理指令

在预处理阶段就会进行处理的指令
以#开头的指令

#include 包含头文件

导入头文件中的代码
调用了标准库的函数时需要导入头文件
#include <> 与 #include ""的区别:
<>   从系统指定的路径(可配置)搜索包含的头文件
""   从当前目录搜索包含的头文件,   
   注:如果在当前目录下没有找到,则去系统指定的目录下搜索
   如果是包含自己写的头文件时用"",包含标准库的文件一般用<>

#define 宏、宏函数

宏名 一般用大写字母
宏定义  在预处理阶段进行简单的宏替换
	例:#define PI 3.14
宏函数
	例:#define POW(x) ((x)*(x))
预处理阶段不进行运算,只进行替换,所以在每个参数后边都应该加上小括号。
	注意:
		1.不要在宏定义后面加上 ;
		2.宏函数需要给每个参数都加上小括号 以及最后整体加上小括号 避免产生歧义
		
	例:#define POW(x) x*x
    	z = POW(x+y);//为 x+y*x+y而不是(x+y)*(x+y) 
		--------------------------------------------------------
    	#define POW(x) ((x)*(x))
 		z = POW(x+y)//为(x+y)*(x+y)
 	 
3.宏函数和参数列表之间不能有额外的空格
	例:#define POW (x) ((x)*(x))  //错误  POW和(x)之间多了一个空格		
	
\ 可以连接宏定义
	一般而言  宏只能放在一行 但是可以通过 \ 来连接多行 作为同一个宏定义
	例:#define SWAP(x, y)  x+=y; \
    	y=x-y; \	
    	x=x-y;
    	
# 可以把一个标识符变成一个字面值字符串
	例1:#define TOSTR(x)  #x
	例2:#define print(x)  printf(#x"=%d\n",x)
	
## 可以生成新的标识符
	例:#define AGE(n) age##n
			int main(){
			int age1 = 10;
			int age2 = 20;
			printf("%d ",AGE(1));//age1
			printf("%d\n",AGE(2));//age2
		}结果为10 20
	
宏的作用:
	1.方便修改
	2.简化编程  
	3.参数没有类型限制  灵活

条件编译:

分支选择语句
	只有当执行时才确定执行哪一个分支,会把两个分支的语句都编译到代码中去
编译时可以选择需要编译的代码

#if    	 根据宏的值来进行条件编译
#elif 	 综合了#else和#if指令的作用
#else    #否则 
#endif   #条件编译结尾
#ifdef   #if defined   如果定义了某个宏   用宏是否定义来进行条件编译
#ifndef  如果没有定义某个宏
#undef   删除一个宏  取消宏定义

#ifdef	ZBS
//如果定义了 ZBS 这个宏 则编译该分支
#else
//如果没有定义  ZBS 这个宏 则编译些分支
#endif	

#ifdef LINUX   //如果定义了LINUX宏
//linux系统代码
#else  //没有定义
//其它系统代码
#endif

宏可以在代码中用  #define 定义
也可以在编译时用  -D 宏名称   来定义宏

根据宏的值:
#if N==1
#elif N==2
#elif N==3
#else    //宏没有定义 以及不满足上面情况下编译
#endif 

#ifdef/#ifndef/#if defined     #endif  //宏是否定义来进行条件编译
#if /#elif  #endif         //宏的值来进行条件编译


多文件编程:
头文件   .h 文件

需要把函数的声明放在.h文件中
实现文件放在.c文件中

头文件卫士:  用于防止多次引用该头文件   
如果不加 程序稍微复杂一些就可能引发重复定义的错误
#ifndef XXX_H__
#define XXX_H__


#endif //XXX_H__

多文编程的步骤:

1.写一个 .h 文件
	头文件卫士
	函数声明  类型声明   声明全局变量(不是定义)
	
2.写.c文件用于实现 .h文件中声明的函数
	需要包含 .h 文件  #include ""
	检查语法错误: gcc -c  x.c  //只编译和汇编  只检查语法错误 并不会链接
	生成 .o 文件 

3.写一个.c 文件里面 写 main函数 调用其它函数
	gcc -c  main.c 
	gcc *.o     链接所有的目标文件 生成 可执行程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值