程序的环境与预处理 程序的编译与链接

news2025/1/15 6:55:23

目录

 1.程序的翻译环境和执行环境

​编辑

2.编译+链接 

运行环境

3.预处理

预定义符号

#define 

#与##

带副作用的宏参数

宏和函数的对比 

命名约定

​编辑

 #undef​编辑

命令行定义

 ​编辑

 条件编译

文件包含

嵌套文件包含 

4.其他预处理指令


 1.程序的翻译环境和执行环境


在ANSL C的任何一种实现中,存在两个不同的环境
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码。

2.编译+链接 

组成一个程序的每个源文件通过编译过程分别转换成目标代码 (obiect code)

每个目标文件由链接器 (linker) 捆绑在一起,形成一个单一而完整的可执行程序。

链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

integrated development environment

 

 

  

1.预处理选项gcc -E test.c -o test.i
预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中
2.编译选项 gcc-S test.c
编译完成之后就停下来,结果保存在test.s中。
3.汇编gcc -c test.c
汇编完成之后就停下来,结果保存在test.o中 


运行环境


3.预处理

预定义符号

示例:


#define 

 示例:

 #define后面要加;吗?

 eg:#define MAX 100;

加了;就代表MAX被“100;”替换 可能引起语法错误呦


示例:

注意与函数的区别:

定义宏是直接替换,而不是像函数一样传具体的值 

那这样是不是就可以解决一些函数中类型不一样无法写成一个函数的问题捏?

是滴!

注意:
参数列表的左括号必须与name紧邻
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分

一些小小的注意事项:

示例:(X*X)  与 ((X)*(X)) 的区别

 

#与##

 

  示例:

宏替换

 #:替换参数对应的字符串 而不是值

替换之后如下:


 示例:(连接作用(将分离合成整体))(但合成的整体必须是有定义的)

打印出的结果为:100


带副作用的宏参数

 示例:


宏和函数的对比 

宏通常被应用于执行简单的运算

比如在两个数中找出较大的一个

#define MAX(a,b)   ((a)>(b)?(a):(b))

那为什么不用函数来完成这个任务?

 函数会:调用——>计算——>返回(小型运算)

宏的缺点:

当然和函数相比宏也有劣势的地方:
1.每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。
2.宏是没法调试的。

3.宏由于类型无关也就不够严谨

4.宏可能会带来运算符优先级的问题,导致程容易出现错

示例:

 

 

 


命名约定


 

 #undef

 示例:


 

命令行定义

 

 条件编译

 

示例:

 

 

3.判断是否被定义

#if defined(symbol)

#ifdef symbol


#if !defined(symbol)

#ifndef symbol


4.嵌套指令
#if defined(OS_UNIX)

       #ifdef OPTION1
                unix_version_option1();

       #endif

       #ifdef  OPTION2
               unix_version_option2();

      #endif
#elif defined(OS_MSDOS)

     #ifdef OPTION2
              msdos_version_option2();#endif
     #endif 

#endif

示例:

 上面两种写法等价

那条件编译与if else语句有何不同捏?

条件编译在预处理阶段就已经把不要的代码删掉了,而if else语句的代码还在留着


文件包含

文件包含
我们已经知道,#include 指令可以使另外一个文件被编译。就像它实际出现于#include 指令的地方
一样。

这种替换的方式很简单

预处理器先删除这条指令,并用包含文件的内容替换。这样一个源文件被包含10次,那就实际被编译10次。

 

VS环境的标准头文件的路径:
c:\Program Files (x86)\Microsoft visual studio 12.0\vc\include
//这是VS2013的默认路径

 

查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。

这样是不是可以说,对于库文件也可以使用“”的形式包含?

答案是肯定的,可以。

但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。

示例:

 


嵌套文件包含 

 如何解决这个问题?
答案:条件编译。
每个头文件的开头写

#ifndef  __TEST_H__

#define  __TEST_H__
//头文件的内容
#endif     //__TEST_H__


或者

#pragma once


就可以避免头文件的重复引入。

示例:

 

 


4.其他预处理指令

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新年伊始,和大家聊聊鲜枣课堂的未来

大家好,我是小枣君。时间过得很快,转眼之间,2022年已经结束了。回首这一年,感觉自己一直都在忙,却想不起来到底忙了些什么。这一年,我的生活和工作节奏,一直都是混乱的。这里面,既有…

罗振宇2023“时间的朋友”跨年演讲原版PPT(附下载)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点2023年,如何科学制定年度规划?《底层逻辑》高清配图清华大学256页PPT元宇宙研究报告.pdf(附下载链接)…

软件测试[用例篇]

一. 回顾测试用例 1.测试用例基本要素 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合。 这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。 2.测试用例好处 测试用例可以提高测试效率(可以减…

省时省力,高速收费站无线组网解决方案

一、行业背景随着我国高速公路里程数的不断增加,科技水平的不断进步,智能化的高速公路收费站趋势在不断的加强。例如;高速公路收费站智能备份系统,通常情况下收费站、路段分中心和省联网中心之间是需要传输收费数据记录流水、清账…

【1801. 积压订单中的订单总数】

来源:力扣(LeetCode) 描述: 给你一个二维整数数组 orders ,其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种&…

关于el-time-picker使用错误的记录

之前在紧急参与一个PC管理后台的项目,项目的基础架子是花裤衩大佬的vue-element-admin()vue2版本),。其中有一个需求是列表数据中数据回显时候,有关时间部分的数据在回显/编辑的情况下,提交时获取的值有问题。虽然后面解决了,但还…

2023年要来了。顺便分享过来后我的学开车经历

你好呀,读者朋友们!我是你们的老朋友 zhen guo时光如梭,转眼间我这边再有1个来小时就2023年了,因时差,很多看到这里的读者朋友应该都已经进入2023年。2022年再也回不去了,就像曾经过去的每一年那样&#xf…

【王道操作系统】2.3.1 进程的同步与互斥

进程的同步与互斥 文章目录进程的同步与互斥1.进程同步2.进程互斥1.进程同步 同步也称为直接制约关系在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系,如等待、传递信息等,引入了…

IP协议重点总结(附实例)

文章目录前言一、IP地址1.1 概念1.2 作用1.3 格式1.4 组成1.5 分类二、NAT地址转换2.1 作用2.2 转换过程2.3 NAPT端口映射2.4 现实中的栗子(以博主的手机为例)2.4.1 连无线WLAN的情况2.4.2 用流量上网2.5 NAT的缺陷三、子网掩码3.1 格式3.2 作用3.3 计算…

windows安装IIS服务

安装ASP的环境IIS 1、使用快捷键 【Win X】 打开系统功能菜单,选择【程序和功能】 2、进入【程序和功能】界面管理后,点击【启用或关闭windows功能】。 3、然后保证以下勾选,其他的默认就行,点击确定。如图: 4、出现…

vueJs中的watch与watchEffect函数

前言有时,我们需要在状态变化时执行一些副作用,比如:监听路由状态,更改DOM,或是根据异步操作的结果去修改另一处的状态这个时候,就需要用到监听器在组合式API中,就可以使用watch函数在每次响应式状态发生变化时触发回调函数01使用watch监视refwatch:监听某个属性的变…

2023.01/1801. 积压订单中的订单总数

1801. 积压订单中的订单总数 题意: 给你一个二维整数数组 orders ,其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种: 0 表示这是一批采购订单 buy …

3D打印:FDM打印使用CURA4.13.1版本配置

一、前言 今天是2023年1月1日,新年阳历的第一天,在整理CSDN和写年度计划,对2022的总结,就像写一篇博客来分享一下我2022年积累的最多的一项经验,就是使用3D打印机,在2022年我先后入手了3台3d打印机&#x…

聊聊数字化转型是个啥

“国有企业首要的职责,就是实现国有资产保值增值。这是衡量国企工作优劣的关键!” ——李克强 如果你开了一家制衣厂,雇佣了10个员工买了10台缝纫机,假设一天可以生产100件衣服。 做老板的你想要提高这家工厂的生产数量&#xff0…

禾元生物冲刺科创板上市:累计亏损超4亿元,贝达药业为主要股东

12月30日,武汉禾元生物科技股份有限公司(下称“禾元生物”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,禾元生物计划募资35.02亿元,将用于植物源重组人血清白蛋白产业化基地建设项目、新药…

更多的可能

1986年12月,路遥的《平凡的世界》出版了,1992年11月17日路遥去世了,享年43岁,距今30年了……人的一生常常是白驹过隙,忽然而已,人们也常常用星空里的流星比喻,细细想来,这还算是夸张…

IDEA集成Gitee,超简单

1. 在IDEA下载Gitee插件 file-Settings-Plugins搜索Gitee,并且install这样IDEA就集成了Gitee 2. 从远程仓库拉取项目 如果打开IDEA已经有项目了,那就先file-close退出,回到这个初始化页面VCS:version control system版本控制系…

怎样提升go中的RSA解密速度2~3倍

背景 我们的业务中大量的使用了RSA加密后的数据包,每个数据包大概17-30K不等,因为从php迁移到go,RSA解密业务是无法避免的,之前一直以为迁移后go的解密速度即使没有php快,但也应该相同因此使用了go中x509.ParsePKCS1PrivateKey和…

公务员国考省考小白需知

文章目录: 一:分类 国考 省考 二:必备途径 1.相关网站 1.1 官网 1.2 机构 1.3 时事 1.4 资源 2.相关公主号 3.应用 三:相关需知 1.考试内容 2.老师选择 3.相关 4.公务员行政级别划分表 一:分类 国考…

嵌入式:ARM最小系统设计详解

文章目录一、什么是最小系统最小系统结构框图最小系统例板嵌入式最小系统硬件功能二、时钟和功率管理( 一 ) 时钟管理1、时钟电路结构2、锁相环 PLL( 二 ) 功率管理正常模式空闲模式低速模式掉电模式三、电源电路设计四、复位电路设计五、JTAG电路六、存储器扩展特性存储器映射…