当前位置: 首页 > news >正文

建设网站目的及功能定位惠安网站建设价格

建设网站目的及功能定位,惠安网站建设价格,专业网站建设信息,如何在阿里云上建设网站#x1f525;博客主页#xff1a;小王又困了 #x1f4da;系列专栏#xff1a;C语言 #x1f31f;人之为学#xff0c;不日近则日退 ❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 目录 一、程序的翻译环境和执行环境 二、详解编译和链接 2.1翻译环境 2.2编译的过… 博客主页小王又困了 系列专栏C语言 人之为学不日近则日退  ❤️感谢大家点赞收藏⭐评论✍️ 目录 一、程序的翻译环境和执行环境 二、详解编译和链接 2.1翻译环境 2.2编译的过程 2.3运行环境 三、预处理详解  3.1预定义符号 3.2#define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 2.2.3 #define 替换规则 3.2.4  # 和 ## 3.2.5 带副作用的宏参数 3.2.6 宏和函数对比 3.2.7 命名约定 3.3 #undef 3.4 命令行定义 3.5 条件编译 3.6 文件包含 3.6.1 头文件被包含的方式 3.6.2 嵌套文件包含 ️前言 在上一章的学习中我们已经学会了从文件中读取信息以及一系列文件操作本章我们就要走进程序了解程序的环境和预处理。 一、程序的翻译环境和执行环境 在ANSI C的任何一种实现中存在两个不同的环境。 第1种是翻译环境在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境它用于实际执行代码。 说明计算机能够执行的是二进制指令。但是我们写出的C语言代码是文本信息计算机不能直接理解所以通过翻译环境将C语言代码转化成二进制的指令可执行程序在通过执行环境来执行二进制指令。 二、详解编译和链接 2.1翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代码object code。每个目标文件由链接器linker捆绑在一起形成一个单一而完整的可执行程序。链接器同时也会引入标准C函数库中任何被该程序所用到的函数而且它可以搜索程序员个人 的程序库将其需要的函数也链接到程序中。 2.2编译的过程 我们可以在Linux系统上使用 gcc 这个编译器演示整个过程。我们可以通过指令观察每个过程做了什么。 预编译test.c -E -o test.i -E 是让编译器进行完预编译就停止然后输出的结果放进test.i文件。 预编译的功能 注释的删除#include 头文件的包含#define 符号的替换 说明所有的预处理指令都是在预处理阶段处理的。 编译gcc -S test.c 编译完成之后就停下来结果保存在test.s中。 编译的功能 把C语言代码翻译成汇编指令 编译过程中会进行语法分析词法分析语义分析符号汇总。 汇编 gcc -c test.c 汇编完成之后就停下来结果保存在test.o中。test.o就是目标文件 汇编的功能 把汇编代码翻译成二进制的指令放进目标文件。 链接 gcc test.o -o test  Linux 环境下 gcc 编译产生的目标文件 test.o ,可执行程序 test 都是按照 ELF 这种文件的格式来存储的。ELF 会把文件分成各种各样的段这时就需要链接来合成这些段表. 链接的功能 合并段表符号表的合并和符号表的重定位 2.3运行环境 程序执行的过程 程序必须载入内存中。在有操作系统的环境中一般这个由操作系统完成。在独立的环境中程序 的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成。程序的执行便开始。接着便调用main函数。开始执行程序代码。这个时候程序将使用一个运行时堆栈stack存储函数的局部变量和返回 地址。程序同时也可以使用静态static内存存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。 终止程序。正常终止main函数也有可能是意外终止。 三、预处理详解  3.1预定义符号 __FILE__              //进行编译的源文件 __LINE__              //文件当前的行号 __DATE__            //文件被编译的日期 __TIME__             //文件被编译的时间 __STDC__            //如果编译器遵循ANSI C其值为1否则未定义 在 gcc 环境中经过预处理对符号进行了替换。 3.2#define 3.2.1 #define 定义标识符 语法形式         #define   name   stuff 例如 #define M 100 #define STR abcint main() {printf(%d\n, M);printf(%s\n, STR);return 0; } 注意 在define定义标识符的时候在最后不要加‘’否则会出现错误。 3.2.2 #define 定义宏 #define 机制包括了一个规定允许把参数替换到文本中这种实现通常称为宏macro或定义宏define macro。 宏的申明方式 #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表它们可能出现在stuff中。 注意 参数列表的左括号必须与name紧邻。 如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分。 例如   #define SQUARE(x) x*xint main() {int a 3;int n SQUARE(a 2);printf(%d\n, n);return 0; } 我们想得到的结果是25这里得到的为什么是11呢 注意在写宏时我们要把每个参数用括号扩起来同时宏整体也要扩起来 。 所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号避免在使用宏时由于参数中 的操作符或邻近操作符之间不可预料的相互作用。  2.2.3 #define 替换规则 在程序中扩展#define定义符号和宏时需要涉及几个步骤  在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。如果是它们首先被替换。替换文本随后被插入到程序中原来文本的位置。对于宏参数名被他们的值所替换。最后再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果是就重复上述处理过程。 注意 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏不能出现递归。 当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索。 3.2.4  # 和 ## 使用 # 把一个宏参数变成对应的字符串 #define PRINT(n,format) printf(the value of #n is format\n,n);int main() {int a 3;PRINT(a, %d);int b 5;PRINT(b, %d);float c 10.0;PRINT(c, %f); } 使用 ##把位于它两边的符号合成一个符号 #define CAT(x,y) (x##y)int main() {int a110 2023;printf(%d\n, CAT(a, 110)); } 3.2.5 带副作用的宏参数 这段代码的结果是什么呢  #define MAX(x, y) ( (x) (y) ? (x) : (y) )int main() {int a 5;int b 6;int c MAX(a, b);printf(a%d\n, a);printf(b%d\n, b);printf(c%d\n, c);return 0; } 宏参数代替后 int c MAX(a, b); int c (a)(b)?(a):(b); a和b都是后置所以都是先使用后。 注意当宏参数在宏的定义中出现超过一次的时候如果参数带有副作用那么你在使用这个宏的时候就可能 出现危险导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。 3.2.6 宏和函数对比 宏通常被应用于执行简单的运算。 比如在两个数中找出较大的一个。 #define MAX(a, b) ((a)(b)?(a):(b)) 不用函数来完成这个任务的原因 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。 所以宏比函数在程序的规模和速度方面更胜一筹。  更为重要的是函数的参数必须声明为特定的类型。 所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以 用于来比较的类型。 宏是类型无关的。 使用宏来计算最大值的汇编代码和用函数计算最大值的汇编代码的对比 宏的缺点当然和函数相比宏也有劣势的地方 每次使用宏的时候一份宏定义的代码将插入到程序中。除非宏比较短否则可能大幅度增加程序 的长度。 宏是没法调试的。 宏由于类型无关也就不够严谨。 宏可能会带来运算符优先级的问题导致程容易出现错。 宏和函数的一个对比 属性#define定义宏函数代码长度 每次使用时宏代码都会被插入到程序中。除了非常 小的宏之外程序的长度会大幅度增长函数代码只出现于一个地方每 次使用这个函数时都调用那个 地方的同一份代码执行速度更快存在函数的调用和返回的额外开 销所以相对慢一些操作符的优先级宏参数的求值是在所有周围表达式的上下文环境里 除非加上括号否则邻近操作符的优先级可能会产生 不可预料的后果所以建议宏在书写的时候多些括号函数参数只在函数调用的时候求 值一次它的结果值传递给函 数。表达式的求值结果更容易预测带 有 副 作 用 的 参 数参数可能被替换到宏体中的多个位置所以带有副作 用的参数求值可能会产生不可预料的结果函数参数只在传参的时候求值一 次结果更容易控制参数的类型宏的参数与类型无关只要对参数的操作是合法的 它就可以使用于任何参数类型函数的参数是与类型有关的如果参数的类型不同就需要不同的函数即使他们执行的任务是相同的调试宏是不方便调试的函数可以调试递归宏是不能递归的函数可以递归 3.2.7 命名约定 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是 把宏名全部大写 函数名不要全部大写 3.3 #undef 这条指令用于移除一个宏定义。 #include stdio.h#define MAX(x,y) ((x)(y)?(x):(y))int main() {int n MAX(3, 5);printf(%d\n, n); #undef MAXint n MAX(10, 5);printf(%d\n, n);return 0; } 当程序编译时会报错。 3.4 命令行定义 许多C 的编译器提供了一种能力允许在命令行中定义符号。用于启动编译过程。 例如当我们根据同一个源文件要编译出一个程序的不同版本的时候这个特性有点用处。假定某个 程序中声明了一个某个长度的数组如果机器内存有限我们需要一个很小的数组但是另外一个机器 内存大些我们需要一个数组能够大些。 编译指令 //Linux 环境演示 gcc -D ARRAY_SIZE10 programe.c 3.5 条件编译 在编译一个程序的时候我们如果要将一条语句一组语句编译或者放弃是很方便的。因为我们有条件编译指令条件满足就编译条件不满足就不编译。 常见的条件编译指令 1.单个条件编译 #if 常量表达式         //... #endif #define M 1 int main() { #if M1printf(hehe\n); #endif } 说明if语句和#if不同#if 表达式为假在预处理阶段就会将代码删除。 2.多个分支的条件编译 #if 常量表达式         //... #elif 常量表达式         //... #else         //... #endif 3.判断是否被定义 如果定义了就执行 #if defined(symbol)         //…  #endif #ifdef symbol         //…  #endif 如果没有定义就执行 #if !defined(symbol)         //…  #endif #ifndef symbol         //…  #endif 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 3.6 文件包含 我们已经知道 #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样。 3.6.1 头文件被包含的方式 本地文件包含 #include filename  查找策略先在源文件所在目录下查找如果该头文件未找到编译器就像查找库函数头文件一样在标 准位置查找头文件。 如果找不到就提示编译错误。 库文件包含 #include filename.h                 查找头文件直接去标准路径下去查找如果找不到就提示编译错误。 对于库文件也可以使用 “” 的形式包含。 但是这样做查找的效率就低些当然这样也不容易区分是库文件还是本地文件了。 3.6.2 嵌套文件包含 当头文件重复包含在预处理阶段就会重复保存文件中的内容这样大大降低了工作效率。为了解决头文件重复包含的问题我们可以使用条件编译。 #ifndef TEST_H #define TEST_H//头文件的内容 #endif //__TEST_H__ 解读如果没有定义TEST_H就执行下面的语句第一次调用一定没有定义TEST_H所以执行下面的语句定义TEST_H头文件中的内容参与编译当第二次在调用时已经定义了 TEST_H下面的代码不参与编译。 #pragma once 本次的内容到这里就结束啦。希望大家阅读完可以有所收获同时也感谢各位读者三连支持。文章有问题可以在评论区留言博主一定认真认真修改以后写出更好的文章。
http://wiki.neutronadmin.com/news/57406/

相关文章:

  • 网站信息平台建设方案钟表玻璃东莞网站建设
  • 社区微网站建设方案提供网络推广服务
  • 酷站官网庐山市建设规划局网站
  • ajax+jsp网站开发从入门到精通彩票网站有人做吗
  • 常州商城网站制作公司wordpress shopme
  • 免费发布网站建设的平台软件开发三个主要阶段
  • 外贸网站建站平台seo怎么优化排名
  • 有哪些电商网站wordpress 滑块插件
  • 模拟炒股网站开发开发门户网站多少钱
  • 空间主机 建网站content index for wordpress
  • 立水桥网站建设网站被抄袭怎么投诉
  • 郓城菏泽网站建设上海网站建设开发
  • 昆明建网站的公司wordpress每篇文章加水印
  • 百度搜索官方网站2023新闻头条最新消息今天
  • 学技能的免费网站开发者选项在哪里打开
  • 杭州网站建设教育机构没域名 打开网站
  • 杭州网站排名提升专业的企业宣传片制作企业
  • 海康打开网站显示建设中rss网站推广法
  • 趣php网站开发实战代码制作网站接单
  • 门户型网站网店营销推广策略
  • 临沧网站建设网站设计西安学习
  • 建设一个网站的基本步骤网站的毕业设计怎么做
  • 灯具网站建设门户网站建设需求模板
  • 免费网站你懂我意思正能量软件网站制作难度
  • 收录查询站长工具上海大型网站开发公司
  • 五合一免费建站中小企业管理软件
  • vc 做网站源码ajax网站开发技术
  • 收纳用品网站建设wordpress 替换图片不显示
  • 运城做网站公司建设银行的官方网站电话
  • 什么网站可以做软件有哪些东西吗深圳公共资源交易平台