C语言基础与总结(4) 预处理

news/2024/11/27 6:20:06/

第 4 章 预处理

4.1 c 语言编译过程

gcc -E hello.c -o hello.i 1、预处理
gcc -S hello.i –o hello.s 2、编译
gcc -c hello.s -o hello.o 3、汇编
gcc hello.o -o hello_elf 4、链接
1:预编译
将.c 中的头文件展开、宏展开
生成的文件是.i 文件
2:编译
将预处理之后的.i 文件生成 .s 汇编文件
3、汇编
将.s 汇编文件生成.o 目标文件
4、链接
将.o 文件链接成目标文件
预处理有几种啊?

4.2 include

#include<>//用尖括号包含头文件,在系统指定的路径下找头文件
#include “” //用双引号包含头文件,先在当前目录下找头文件,找不到,再到系统指定的路径下找。

注意:include 经常用来包含头文件,可以包含 .c 文件,但是大家不要包含.c
因为 include 包含的文件会在预编译被展开,如果一个.c 被包含多次,展开多次,会导致函数重复定义。
所以不要包含.c 文件。

注意:预处理只是对 include 等预处理操作进行处理并不会进行语法检查
这个阶段有语法错误也不会报错,第二个阶段即编译阶段才进行语法检查。

4.3 define

定义宏用 define 去定义
宏是在预编译的时候进行替换。

1、不带参宏

#define PI 3.14
在预编译的时候如果代码中出现了 PI 就用 3.14 去替换。
宏的好处:只要修改宏定义,其他地方在预编译的时候就会重新替换。
**注意:宏定义后边不要加分号。 **

例 2: 
#define PI 3.1415926 
int main() 
{ double f; printf("%lf\n",PI); f=PI; return 0; 
} 

宏定义的作用范围,从定义的地方到本文件末尾。
**如果想在中间终止宏的定义范围 **
**#undef PI //终止 PI 的作用 **

例 3: 
#define PI 3.1415926 
int main() 
{ double f; printf("%lf\n",PI); #undef PI #define PI 3.14 f=PI; return 0; 
} 

2、带参宏

#define S(a,b) a*b
注意带参宏的形参 a 和 b 没有类型名,
S(2,4) 将来在预处理的时候替换成 实参替代字符串的形参,其他字符保留,2 * 4

例 4: 
#define S(a,b) a*b 
int main(int argc, char *argv[]) 
{int num; num=S(2,4); return 0; 
} 

S(2+4,3)被替换成 2+4 * 3
注意:带参宏,是在预处理的时候进行替换
解决歧义方法

例 5: 
#define S(a,b) (a)*(b) 
int main(int argc, char *argv[]) 
{ int num; num=S(2+3,5);//(2+3)*(5) return 0; 
} 

3、带参宏和带参函数的区别

带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏,是浪费了空间,因为被展开多次,节省时间。
带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要压栈弹栈。有个调用的过程。所以说,带参函数是浪费了时间,节省了空间。
带参函数的形参是有类型的,带参宏的形参没有类型名。

4.4 选择性编译

1、 #ifdef

#ifdef AAA
代码段一
#else
代码段二
#endif
如果在当前.c ifdef 上边定义过 AAA ,就编译代码段一,否则编译代码段二
注意和 if else 语句的区别,if else 语句都会被编译,通过条件选择性执行代码
而选择性编译,只有一块代码被编译

例6: 
#define AAA 
int main(int argc, char *argv[]) 
{ #ifdef AAA printf("hello kitty!!\n"); #else printf("hello 千锋 edu\n"); #endif return 0; 
} 

2、 #ifndef

#ifndef AAA
代码段一
#else
代码段二
#endif
和第一种互补。
这种方法,经常用在防止头文件重复包含。
防止头文件重复包含:

3、 #if

#if 表达式
程序段一
#else
程序段二
#endif
如果表达式为真,编译第一段代码,否则编译第二段代码
选择性编译都是在预编译阶段干的事情。


http://www.ppmy.cn/news/340210.html

相关文章

【微前端架构】微前端——功能团队中缺失的一块拼图

在任何合法的前端开发团队中&#xff0c;提高可扩展性和敏捷性很少会成为头等大事。在处理大型、复杂的产品时&#xff0c;如何确保快速、频繁地交付同时包含后端和前端的功能&#xff1f;像后端那样将前端单体分解成许多更小的部分似乎是答案。如果执行得当&#xff0c;微前端…

网站建设需要多少钱 开发一个网站有哪些费用

网站建设是一件比较复杂的事情&#xff0c;需要专业的人员才可建设出正规的网站&#xff0c;需要花费一定的时间&#xff0c;在网站建设费用上也比较多&#xff0c;下面我们就来了解下建设一个网站的时候有哪些方面需要花费。 1、设计费用 如果你需要的网站只需要有两三个功能…

做一个电商网站需要多少钱

做一个电商网站需要多少钱 做一个电商网站详细成本 一、域名费用&#xff1a;有些的顶级域名非常贵&#xff0c;但如果需要搭建一个好的商城&#xff0c;那么域名也要最好的&#xff0c;因此&#xff0c;域名的成本非常高。 二、服务器费用&#xff1a;电商每天处理大量的数据&…

做网站需要多少钱?做网站的费用是多少呢?

目前来&#xff0c;做网站的费用方面是不固定的&#xff0c;主要还是根据用需求去选择&#xff0c;因为用户的需求不同的话&#xff0c;建网站的方式也是不同的。所以用户在这方面选择的时候&#xff0c;应该要根据自己的需求和需要去选择就可以了。也就是说需要什么样网站模板…

现在做网站到底需要多少钱?

网站是什么时候火的&#xff0c;大概追溯到10年前吧&#xff0c;而cms建站程序呢&#xff0c;应该是1011年的样子&#xff0c;如今&#xff0c;建站系统似乎已经不是很流行了&#xff0c;有这种感觉&#xff0c;就是当你在网上搜索建站的时候&#xff0c;感觉是个人就得会做网站…

建站最少需要多少钱

市面上有很多免费建站产品&#xff0c;用这种免费产品的限制很多&#xff0c;比方说每月限制300访问&#xff0c;也就是每天10个人点开你的网站&#xff1b;有广告&#xff1b;资源库只有30M容量&#xff1b;不能有外部链接&#xff1b;没有交互&#xff1b;不支持SEO等等。下面…

架设一个网站建设一个网站需要花费多少

要计算花费&#xff0c;这首先要取决于你的要求&#xff0c;一是&#xff0c;想做站的类型&#xff0c;二用什么方式建站。 做站的类型很多&#xff0c;有展示型&#xff08;几百到几千&#xff09;&#xff0c;营销型&#xff0c;电商型&#xff0c;&#xff08;上千元&#x…

开发一个电商网站大概多少钱

开发一个电商网站会因为系统功能、开发商、硬件等因素影响电商网站开发报价。每一个影响电商网站开发费用的介绍&#xff0c;如下&#xff1a; 与功能需求有关 电商平台开发费用需要知道所有的网站在建设出来之后都应该掌握好其功能才能够获得收益&#xff0c;不要多余的功能…