C语言-预处理

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 文件链接成目标文件

2.include

#include<>//用尖括号包含头文件,在系统指定的路径下找头文件

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

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

所以不要包含.c 文件。

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

3.define

定义宏用define 去定义

宏是在预编译的时候进行替换。

3.1、不带参宏 

#define PI 3.14

在预编译的时候如果代码中出现了PI 就用 3.14去替换。

宏的好处:只要修改宏定义,其他地方在预编译的时候就会重新替换。

注意:宏定义后边不要加分号。

1 #include <stdio.h>

2

3 //宏定义的好处是只要改变了定义是的常量表达式,则代码中只要使用这个宏定义的位置都会改变

4 #define PI 3.1415926

5

6 int main(int argc, char *argv[])

7 {

8 printf("PI = %lf\n", PI);

9

10 double d = PI;

11 printf("d = %lf\n", d);

12

13 return 0;

14 }

执行结果

宏定义的作用范围,从定义的地方到本文件末尾。

如果想在中间终止宏的定义范围

#undef PI //终止PI的作用

3.2、带参宏

#define  S(a,b)  a*b

注意带参宏的形参 a和b没有类型名,

S(2,4) 将来在预处理的时候替换成 实参替代字符串的形参,其他字符保留,2 * 4

1 #include <stdio.h>

2

3 //带参宏

4 //带参宏类似于一个简单的函数,将函数的参数进行设置,就可以传递给对应的表达式

5 //#define S(a, b) a*b

6 #define S(a, b) ((a)*(b))

7

8 int main(int argc, char *argv[])

9 {

10 printf("%d\n", S(2, 4));

11 //注意:宏定义只是简单的替换,不会自动加括号

12 //带参宏12 + 8 * 4 = 34

13 //带参宏2((2 + 8) * (4)) = 40

14 printf("%d\n", S(2 + 8, 4));

15

16 return 0;

17 }

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

带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏,是浪费了空间,因为被展开多次,节省时间。

带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要压

栈弹栈。有个调用的过程。所以说,带参函数是浪费了时间,节省了空间。

带参函数的形参是有类型的,带参宏的形参没有类型名。

如果功能实现的代码相对简单,并且不需要开辟太多的空间,可以选择使用带参宏,但是大多数情况都会使用函数

4.选择性编译

4.1、

#ifdef AAA

代码段一

#else

代码段二

#endif

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

1 #define AAA

2

3 int main(int argc, char *argv[])

4 {

5 #ifdef AAA

6 printf("hello kitty!!\n");

7 #else

8 printf("hello 千锋edu\n");

9 #endif

10 return 0;

11 }

4.2、 

#ifndef AAA

代码段一

#else

代码段二

#endif

和第一种互补。

这种方法,经常用在防止头文件重复包含。

常用于多文件编程中.h的第一行就是#ifndef,最后一行就是#endif

4.3

#if 表达式

程序段一

#else

程序段二

#endif

如果表达式为真,编译第一段代码,否则编译第二段代码

这种形式一般用于注释多行代码

#if 0

...

#endif

选择性编译都是在预编译阶段干的事情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/351908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈WPF之样式与资源

WPF通过样式&#xff0c;不仅可以方便的设置控件元素的展示方式&#xff0c;给用户呈现多样化的体验&#xff0c;还简化配置&#xff0c;避免重复设置元素的属性&#xff0c;以达到节约成本&#xff0c;提高工作效率的目的&#xff0c;样式也是资源的一种表现形式。本文以一个简…

数学建模论文笔记

一、概述 1. 数学建模论文组成 论文电子版&#xff1a;摘要页、正文、参考文献、附录支撑材料&#xff1a;源程序代码以及调用说明、中间结果、支撑数据等首页&#xff1a;论文题目、摘要、关键词论文正文&#xff1a;问题重述、问题分析、模型假设、符号说明、模型建立与求解…

centos 7 增加临时路由及永久路由

centos 7 增加临时路由及永久路由 如果增加临时路由&#xff0c;要先安装net-tools , sudo yum install net-tools route add -net 10.1.0.0 gw 10.1.1.1 netmask 255.255.0.0 意思是增加了一条动态路由&#xff0c;网关10.1.1.1 ,10.1.x.x 的所有ip都走这个网关 此种方式&am…

常见OLAP对比

Olap&#xff08;On-line Analytical Processing&#xff0c;联机分析处理&#xff09;&#xff1a;是在基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合。可以比较下其与传统的OLTP&#xff08;On-line Transaction Processing&#xff0c;联机事务处理&#xff…

C语言第十弹---函数(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、函数的概念 2、库函数 2.1、标准库和头文件 2.2、库函数的使用方法 2.2.1、功能 2.2.2、头文件包含 2.2.3、实践 2.2.4、库函数文档的⼀般格式 …

Unity中URP下额外灯的距离衰减

文章目录 前言一、额外灯的距离衰减二、DistanceAttenuation函数的传入参数1、distanceSqr2、distanceAndSpotAttenuation3、_AdditionalLightsAttenuation4、GetPunctualLightDistanceAttenuation函数三、DistanceAttenuation函数的程序体 前言 在上一篇文章中&#xff0c;我…

组件冲突、data函数、组件通信

文章目录 1.组件的三大组成部分 - 注意点说明2.组件的样式冲突&#xff08;用 scoped 解决&#xff09;3.data是一个函数4.组件通信1.什么是组件通信&#xff1f;2.不同的组件关系 和 组件通信方案分类 5.prop详解prop 校验①类型校验②完整写法&#xff08;类型&#xff0c;非…

计算机毕业设计 | SSM 凌云招聘平台(附源码)

1&#xff0c;绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

什么是SQL,什么是MYSQL?MYSQL的架构以及SQL执行语句的过程是什么?有哪些数据库的类型?一篇文章带你弄懂!

文章目录 前言一、为什么需要数据库二、数据库的相关概念1.什么是结构化查询语言 (SQL)2.什么是数据库管理系统 (DBMS)3.什么是 MySQL 数据库 三、数据库分类1.关系型数据库&#xff08;SQL&#xff09;2.非关系型数据库&#xff08;NoSQL&#xff09; 四、MYSQL架构1.各组件功…

初识MQRabbitMQ快速入门

一、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…

「JavaSE」类和对象4

类和对象4 &#x1f349;内部类&#x1f34c;实例内部类&#x1f34c;静态内部类&#x1f34c;局部内部类&#x1f34c;匿名内部类 &#x1f349;总结 &#x1f349;内部类 在 Java 中&#xff0c;我们可以将一个类定义在另一个类或者一个方法的内部&#xff0c;前者称为内部类…

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型&#xff0c;即广播网络和点到点网络。与 OSPF 协议相同&#xff0c; IS-IS 协议在广播网络中会将网络视为一个伪节点 &#xff08; Pesudonde&#xff0c;简称 PSN&#xff09;&#xff0c;并选举出一台DIS &#xff08;Designated IS&#xff09…

探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题&#xff1a;动态旭日图数据源扩展&#xff1a;外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色&#xff0c;而Pyecharts是Python中一个…

Tomcat怎么优化

目录 性能方面的优化&#xff1a; 安全方面的优化&#xff1a; 引言&#xff1a;面试官问到的Tomcat怎么优化&#xff0c;这两个方面直接得到他认可&#xff01;&#xff01; 性能方面的优化&#xff1a; 内存优化&#xff1a;-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

操作系统的引入

操作系统 【1】什么是操作系统 操作系统是一种管理的计算机硬件的软件资源的程序。它充当了计算机系统和应用程序之间的接口。使得计算机用户能够地使用计算机系统来完成各种任务。操作系统是负责管理和分配计算机的处理器、内存、硬盘等等硬件资源&#xff0c;同时也提供一些…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式&#xff0c;主要包括在css,less,scss中的使用&#xff0c;可以参考官方文档查看&#xff1a;Vue3官方文档 特别提醒 如果你想在scss中或者less中使用&#xff0c;可能会报各种乱七八糟的错误&#xff0c;最快最好用的方式就是单…

Android P 背光机制流程分析

在android 9.0中&#xff0c;相比android 8.1而言&#xff0c;背光部分逻辑有较大的调整&#xff0c;这里就对android P背光机制进行完整的分析。 1.手动调节亮度 1.1.在SystemUI、Settings中手动调节 在界面(SystemUI)和Settings中拖动进度条调节亮度时&#xff0c;调节入口…

[docker] Docker的私有仓库部署——Harbor

一、Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库&#xff0c;共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有必要的…

那些年与指针的爱恨情仇(一)---- 指针本质及其相关性质用法

关注小庄 顿顿解馋 (≧∇≦) 引言&#xff1a; 小伙伴们在学习c语言过程中是否因为指针而困扰&#xff0c;指针简直就像是小说女主&#xff0c;它逃咱追&#xff0c;我们插翅难飞…本篇文章让博主为你打理打理指针这个傲娇鬼吧~ 本节我们将认识到指针本质&#xff0c;何为指针和…

将Html页面转换为Wordpress页面

问题&#xff1a;我们经常会从html源码下载网站上获得我们想要的网站内容框架&#xff0c;以及部分诸如联系我们&#xff0c;About 等内页&#xff0c;但是在文章的发布上&#xff0c;则远不如Wordpress简便。而Wordpress尽管有各种模板&#xff0c;但修改又比较麻烦。解决方法…