天津网站建设费用电脑可以做网站主机么

pingmian/2025/10/7 21:13:34/文章来源:
天津网站建设费用,电脑可以做网站主机么,大连龙采做网站行不行,网店代理免费加盟C编译环境和预处理#xff08;非常详细#xff0c;建议收藏#xff09; 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么#xff1f; 2.2 运行环境 三、预处理详解3.1 预定义… C编译环境和预处理非常详细建议收藏 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么 2.2 运行环境 三、预处理详解3.1 预定义符号3.2 #define3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 # 和####的作用3.2.5 命名约定 四、宏和函数对比五、 #undef六、命令行定义七、条件编译八、文件包含8.1 头文件被包含的方式8.2 嵌套文件包含 一、程序的翻译环境和执行环境 在ANSI C的任何一种实现中存在两个不同的环境 第1种是翻译环境在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境它用于实际执行代码。 二、 详解编译链接 2.1 翻译环境 在C语言中组成一个程序的每个源文件通过编译过程分别转换成目标代码object code。每个目标文件由链接器linker捆绑在一起形成一个单一而完整的可执行程序。 链接器同时也会引入标准C函数库中任何被该程序所用到的函数而且它可以搜索程序员个人的程序库将其需要的函数也链接到程序中。 2.2 编译本身的几个阶段 符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么 符号表的合并和重定位相关解析 符号表合并当编译多个源文件时每个源文件都会生成一个独立的符号表。链接器的任务之一是将这些符号表合并成一个全局符号表。合并的过程中链接器会检查符号表中的每个符号处理重复定义的符号并为每个符号分配一个全局唯一的标识符以便在整个程序中进行引用和访问。 符号重定位在链接器进行符号表合并后需要对程序中的符号进行重定位。重定位是将程序中的每个符号引用与其对应的定义进行关联使得程序在执行时能够正确地访问和使用这些符号。这包括将函数调用与实际的函数定义关联起来将变量引用与其实际存储位置关联起来等。 地址分配链接器还负责为程序中的每个变量和函数分配存储地址。根据符号表中的信息链接器决定将每个符号分配到内存的哪个位置并生成相应的目标代码或可执行文件。 2.2 运行环境 程序执行的过程 程序必须载入内存中。在有操作系统的环境中一般这个由操作系统完成。在独立的环境中程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成。程序的执行便开始。接着便调用main函数。开始执行程序代码。这个时候程序将使用一个运行时堆栈函数栈帧存储函数的局部变量和返回地址。程序同时也可以使用静态static内存存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。终止程序。正常终止main函数也有可能是意外终止。 如果读者想深入了解更详细信息博主在这推荐一本好书《程序员的自我修养》 三、预处理详解 3.1 预定义符号 在C语言中 预定义符号如下预定义符号都是语言内置的 符号含义FILE进行编译的源文件LINE文件当前的行号DATE文件被编译的日期TIME文件被编译的时间STDC如果编译器遵循ANSI C其值为1否则未定义 实例 #include stdio.hint main() {printf(%s\n %d\n %s\n %s\n, __FILE__, __LINE__, __DATE__, __TIME__);return 0; }3.2 #define 3.2.1 #define 定义标识符 语法 #define name stuff 实例 #define MAX 1000 #define reg register //为 register这个关键字创建一个简短的名字 #define do_forever for(;;) //用更形象的符号来替换一种实现 #define CASE break;case //在写case语句的时候自动把 break写上。 // 如果定义的 stuff过长可以分成几行写除了最后一行外每行的后面都加一个反斜杠(续行符)。 #define DEBUG_PRINT printf(file:%s\tline:%d\t \ date:%s\ttime:%s\n ,\__FILE__,__LINE__ ,\__DATE__,__TIME__ ) 在define定义标识符的时候, 不要在最后加 ; 3.2.2 #define 定义宏 #define 机制包括了一个规定允许把参数替换到文本中这种实现通常称为宏macro或定义宏define macro。 下面是宏的申明方式 #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表它们可能出现在stuff中。 注意 参数列表的左括号必须与name紧邻。如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分。   比如 \#define SQUARE( x ) x * x 这个宏接收一个参数 x .如果在上述声明之后你把SQUARE( 5 );置于程序中 预处理器就会用下面这个表达式替换上面的表达式5 * 5 这个宏存在一个问题 观察下面的代码段int a 5; printf(%d\n ,SQUARE( a 1) ); 乍一看你可能觉得这段代码将打印36这个值。事实上它将打印11。为什么呢 替换文本时参数x被替换成a 1,所以这条语句实际上变成了printf (%d\n,a 1 * a 1 ); 这样就比较清晰了由替换产生的表达式并没有按照预想的次序进行求值。 所以对数值表达式进行求值的宏定义为了避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用一般会加上括号。 比如#define SQUARE( x ) ( (x) * (x) ) 3.2.3 #define 替换规则 在程序中扩展#define定义符号和宏时需要涉及几个步骤。 在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。如果是它们首先被替换。替换文本随后被插入到程序中原来文本的位置。对于宏参数名被他们的值所替换。最后再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果是就重复上述处理过程。 注意 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏不能出现递归。当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索。 3.2.4 # 和## 如何把参数插入到字符串中 首先我们看看这样的代码char* p hello bit\n; printf(hello bit\n); printf(%s, p); 虽然这种写法少见但的确是被允许的结果为hello bit 我们发现字符串是有自动连接的特点的 那我们是不是可以写这样的代码 #define PRINT(FORMAT, VALUE)\printf(the value is FORMAT\n, VALUE); ... PRINT(%d, 10);这里只有当字符串作为宏参数的时候才可以把字符串放在字符串中。 另外一个技巧是 使用 # 把一个宏参数变成对应的字符串。比如 int i 10; #define PRINT(FORMAT, VALUE)\printf(the value of #VALUE is FORMAT \n, VALUE); ... PRINT(%d, i3);//产生了什么效果代码中的 #VALUE 会预处理器处理为“VALUE” . 最终的输出的结果应该是the value of i3 is 13 ##的作用 ##可以把位于它两边的符号合成一个符号。它允许宏定义从分离的文本片段创建标识符。 #define ADD_TO_SUM(num, value) sum##num value; ... ADD_TO_SUM(5, 10);//作用是给sum5增加103.2.5 命名约定 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。那我们平时的一个习惯是 把宏名全部大写 函数名不要全部大写 四、宏和函数对比 宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个#define MAX(a, b) ((a)(b)?(a):(b)) 那为什么不用函数来完成这个任务 原因有二 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以用于来比较的类型。宏和类型无关的。 宏的缺点当然和函数相比宏也有劣势的地方 每次使用宏的时候一份宏定义的代码将插入到程序中。除非宏比较短否则可能大幅度增加程序的长度。宏是没法调试的。宏由于类型无关也就不够严谨。宏可能会带来运算符优先级的问题导致程容易出现错。 宏有时候可以做函数做不到的事情。比如宏的参数可以出现类型但是函数做不到。 #define MALLOC(num, type)\(type *)malloc(num * sizeof(type)) ...//使用MALLOC(10, int);//类型作为参数//预处理器替换之后(int *)malloc(10 * sizeof(int));宏和函数的一个对比 属性#define定义宏函数代码长度每次使用时宏代码都会被插入到程序中。除了非常小的宏之外程序的长度会大幅度增长函数代码只出现于一个地方每次使用这个函数时都调用那个地方的同一份代码执行速度更快存在函数的调用和返回的额外开销所以相对慢一些操作符优先级宏参数的求值是在所有周围表达式的上下文环境里除非加上括号否则邻近操作符的优先级可能会产生不可预料的后果所以建议宏在书写的时候多些括号。函数参数只在函数调用的时候求值一次它的结果值传递给函数。表达式的求值结果更容易预测。带有副作用的参数参数可能被替换到宏体中的多个位置所以带有副作用的参数求值可能会产生不可预料的结果。函数参数只在传参的时候求值一次结果更容易控制。参数类型宏的参数与类型无关只要对参数的操作是合法的它就可以使用于任何参数类型。函数的参数是与类型有关的如果参数的类型不同就需要不同的函数即使他们执行的任务是相同的。调试宏是不方便调试的函数是可以逐语句调试的递归宏是不能递归的函数是可以递归的 五、 #undef 这条指令用于移除一个宏定义 #undef NAME //如果现存的一个名字需要被重新定义那么它的旧名字首先要被移除。六、命令行定义 许多C 的编译器提供了一种能力允许在命令行中定义符号。用于启动编译过程。 例如当我们根据同一个源文件要编译出一个程序的不同版本的时候这个特性有点用处。假定某个程序中声明了一个某个长度的数组如果机器内存有限我们需要一个很小的数组但是另外一个机器内存大些我们需要一个数组能够大些。 #include stdio.h int main() {int array [ARRAY_SIZE]; int i 0; for(i 0; i ARRAY_SIZE; i ) { array[i] i;}for(i 0; i ARRAY_SIZE; i ){printf(%d ,array[i]);}printf(\n );return 0; }编译指令//linux 环境演示 gcc -D ARRAY_SIZE10 programe.c 七、条件编译 在编译一个程序的时候我们如果要将一条语句一组语句编译或者放弃是很方便的。因为我们有条件编译指令。   比如 调试性的代码删除可惜保留又碍事所以我们可以选择性的编译。 #include stdio.h #define __DEBUG__ int main() {int i 0;int arr[10] {0}; for(i0; i10; i) { arr[i] i;#ifdef __DEBUG__printf(%d\n, arr[i]);//为了观察数组是否赋值成功。 #endif //__DEBUG__ }return 0; }常见的条件编译指令 1. #if 常量表达式 //... #endif //常量表达式由预处理器求值。如 #define __DEBUG__ #if __DEBUG__//.. #endif2.多个分支的条件编译 #if 常量表达式 //... #elif 常量表达式 //... #else//... #endif3.判断是否被定义 #if defined(symbol) #ifdef symbol #if !defined(symbol) #ifndef symbol4.嵌套指令 #if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif #elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif #endif八、文件包含 我们已经知道 #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方一样。 这种替换的方式很简单 预处理器先删除这条指令并用包含文件的内容替换。 这样一个源文件被包含10次那就实际被编译10次。 8.1 头文件被包含的方式 本地文件包含。如#include filename 查找策略先在源文件所在目录下查找如果该头文件未找到编译器就像查找库函数头文件一样在标准位置查找头文件。 如果找不到就提示编译错误。 库文件包含。如#include filename.h 查找头文件直接去标准路径下去查找如果找不到就提示编译错误。 这也说明了对于库文件也可以使用 “” 的形式包含。 但是这样做查找的效率就低些当然这样也不容易区分是库文件还是本地文件了。 8.2 嵌套文件包含 下面是一张嵌套文件示意图。程序最终出现了两份comm.h内容 如何解决呢这就要用到条件编译了   每个头文件的开头写 #ifndef __TEST_H__ #define __TEST_H__ //头文件的内容 #endif //__TEST_H__方法2 #pragma once这样就可以避免头文件的重复引入了。

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

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

相关文章

Python用数据库做网站做一个网站能卖多少钱

1. 外部类 (写在pulic修饰的类外面) 2. 静态内部类(写在类的里面) 3. 局部内部类(写在方法里面) 4. 匿名内部类 5. 函数式接口。lambada表达式。public class LambdaDemo01 {/*** 2. 静态内部类*/static class Love02 implements Lover {Overridepublic void love() {System.ou…

交换机做网站在招聘网站里做电话销售

java的封装,继承,多态 1 封装 1.1 封装 指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的…

企业手机网站建设流程图关键词查询网址

1.解析原理图 由上图可以看到8个共阳LED灯接到了573输出口,而573输入接到单片机P0口上。当573 LE脚输入高电平时,输出随输入变化,当LE为低电平时,输出锁存。 由上图可以看到Y4C接到了或非门74HC02的输出端,而输入端为…

袜子网站建设规划书推广网站概况

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧&…

手机端网站建设广告词做网站的价格是多少

3166练27.3 称心如意《信息学奥赛一本通编程启蒙(C版)》 【题目描述】 每次测试后狐狸老师总会把成绩输入计算机,进行处理分析。但输入时有时会出错,如当满分为100分时,输入小于0或大于100的数,表示输入有…

如何加强省市级政门户网站建设建设银行上海分行招聘网站

1. Symbol概念以及引入原因 ES6 引入了的一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、…

企业网站建设免备案镇江方圆建设监理咨询有限公司网站

提到家务清洁,相信应该是很多宝妈头疼的事儿,不仅工作量打,耗时又耗力,拥有一款完美的清洁工具,那讲大大的提升幸福指数,而洗地机便是当下的智能清洁神器之一。那么家用洗地机哪个牌子最好用,质…

外国炫酷网站网址新做的网站如何

From: http://www.bubuko.com/infodetail-598915.html

喀什百度做网站多少钱定制网络零信任

小家电中要说对自己家里最有用的,其中之一就是扫地机器人,自从三年多前开始用了扫地机器人后,家里的地面是大为改观,劳动强度大为下降,可谓朕心甚慰。从此之后,一发不可收拾,用过也有20台以上的…

高端网站开发哪里好个人特种证件查询网站

Reflector类负责对一个类进行反射解析&#xff0c;并将解析后的结果在属性中存储起来。 一个类反射解析后都有哪些属性呢&#xff1f;我们可以通过Reflector类定义的属性来查看 public class Reflector {// 要被反射解析的类private final Class<?> type;// 可读属性列…

大型小说网站开发语言社交网站 cms

简介&#xff1a; 2020 年的“十一出行节”期间&#xff0c;高德地图创造了记录 ——截止 2020 年 10 月 1 日 13 时 27 分 27 秒&#xff0c;高德地图当日活跃用户突破 1 亿&#xff0c;比 2019 年 10 月 1 日提前 3 时 41 分达成此记录。 期间&#xff0c;Serverless 作为其中…

dedecms做模板网站网站上怎么做动画广告视频在线观看

基于Camunda实现bpmn中各种类型任务 ​ Camunda Modeler -为流程设置器&#xff08;建模工具&#xff09;&#xff0c;用来构建我们的流程模型。Camunda Modeler流程绘图工具&#xff0c;支持三种协议类型流程文件分别为&#xff1a;BPMN、DMN、Form。 ​ Camunda Modeler下载…

网站建设具体工作重庆彼客的网站是谁家做的

PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域&#xff0c;发现可视化领域有意思的内容。不想错过可视化领域的精彩内容, 就快快关注我们吧 :) 微信订阅号&#xff1a;popodv_com谷歌决定关闭云可视化服务 Fusion Tables谷歌宣布即将关闭其 Fusion Tables 云服务&#x…

有哪些做微信小游戏的网站wordpress网站恢复

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

杭州网站排名优化公司在线做头像网站有哪些

C#基础 1. 简述值类型和引用类型有什么区别2. C# String类型比 stringBuilder 类型的优势是什么?3.面向对象的三大特点4.请简述private&#xff0c;public&#xff0c;protected&#xff0c;internal的区别5.结构体和类6.请描述Interface与抽象类之间的不同7.在类的构造函数前…

网站语音转写怎么做天元建设集团有限公司总工程师

写在前面你想成为Python爬虫的高手么&#xff1f;你想爬取你想要的高质量数据么&#xff1f;那么你得需要进行爬虫项目的演练&#xff0c;那样你才有可能在Python爬虫的道路上走的更远小编在这里精心总结了20个爬虫项目的演练&#xff0c;是目前爬虫高手一直专注的领域。小编将…

变更股东怎样在工商网站做公示婚车租赁

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述(CMU,CCM,TBU,MON) 1 时钟管理单元(CMU)2 集群配置模块(CCM)3 时基单元(TBU)4 监控单元(MON)5 总结由前文的各篇内容,开发者已经知道如何使用GTM的大部分功能,在这些功能中,都需要一个信息就是fGTM 的数据,我们在前…

外管局网站做延期收汇报告衡阳建设网站

我的windows11系统上&#xff0c;之前已经安装好了window版本的docker&#xff0c;没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤&#xff1a; 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

网站开发模板免费下载wordpress如何去掉版权

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 方法一&#xff1a;移动窗口 设置两个指针&…

手机商城网站旅游景区网站建设方案

“生成式 AI 提醒我们&#xff0c;很难做出有关于人工智能的预测。十年前&#xff0c;传统观点认为&#xff1a;人工智能首先会影响体力劳动&#xff1b;然后&#xff0c;是认知劳动&#xff1b;然后&#xff0c;也许有一天它可以做创造性工作。现在看起来&#xff0c;它会以相…