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

企业网站做口碑营销凡科网络

企业网站做口碑营销,凡科网络,上海市工程咨询行业协会,微信怎样创建公众号流程图 1.程序的翻译环境和执行环境 在ANSIC任何一种实现下,都存在两种环境,程序的翻译环境和执行环境 翻译环境:将源代码转换成机器指令 执行环境:用于执行代码 2.详解编译链接 简单的说一个代码从编写到看到控制台的结果分为编译链接两步即可,接下来我们将详细解释编译链接中…流程图 1.程序的翻译环境和执行环境 在ANSIC任何一种实现下,都存在两种环境,程序的翻译环境和执行环境 翻译环境:将源代码转换成机器指令 执行环境:用于执行代码 2.详解编译链接 简单的说一个代码从编写到看到控制台的结果分为编译链接两步即可,接下来我们将详细解释编译链接中的步骤,帮助读者更好的理解c语言的执行步骤. 2.1 翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代码(.o文件)object code。 每个目标文件由链接器linker捆绑在一起形成一个单一而完整的可执行程序。 链接器同时也会引入标准C函数库中任何被该程序所用到的函数而且它可以搜索程序员个人的程序库将其需要的函数也链接到程序中.   2.2 编译 这里我们给定几段代码区体现它编译时候发生的事情,我们先给定结论,最后再一步一步解释 //sum.c int g_val 2016; void print(const char *str) {printf(%s\n, str); } //test.c #include stdio.h int main() {extern void print(char *str);extern int g_val;printf(%d\n, g_val);print(hello bit.\n);return 0; } 注:以上_sum等地址是我随意编撰的地址 在vs这种集成环境中,我们不好去测试,我们可以选择在linux环境下进行测试 1. 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来预处理之后产生的结果都放在test.i文件中。 2. 编译 选项 gcc -S test.c 编译完成之后就停下来结果保存在test.s中。 3. 汇编 gcc -c test.c 汇编完成之后就停下来结果保存在test.o中。   2.3 运行环境  程序执行的过程 1. 程序必须载入内存中。在有操作系统的环境中一般这个由操作系统完成。在独立的环境中程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成。 2. 程序的执行便开始。接着便调用main函数 3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈stack存储函数的局部变量和返回地址。程序同时也可以使用静态static内存存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。 4. 终止程序。正常终止main函数也有可能是意外终止。   3.预处理  3.1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C其值为1否则未定义 #define _CRT_SECURE_NO_WARNINGS #include stdio.h int main() {//__FILE__ //进行编译的源文件//__LINE__ //文件当前的行号// __DATE__ //文件被编译的日期// __TIME__ //文件被编译的时间// __STDC__ //如果编译器遵循ANSI C其值为1否则未定义printf(%s\n, __FILE__);printf(%d\n,__LINE__ );printf(%s\n, __DATE__);printf(%s\n, __TIME__);return 0; } 我们不妨打印出来看看  3.2 #定义标识符 语法 #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 注:参数列表的左括号必须与name紧邻。 如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分 #define在进行简单运算的时候可以使用,但是复杂运算的时候不建议使用,可能由于优先级的原因发生错误 举例: #define SQUARE( x ) x * xSQUARE( 5 ); // 答案是5*5//执行以下代码 int a 5; printf(%d\n ,SQUARE( a 1) );//答案是11而不是36 因为替换的时候是 51*51 11 所以我们建议使用宏的时候加上括号 #define SQUARE(x) (x) * (x) 还有一个问题,当我们定义了这样一个宏的时候,传入这样的参数 #define DOUBLE(x) (x) (x)int a 5; printf(%d\n ,10 * DOUBLE(a));//替换后 printf (%d\n,10 * (5) (5)); 所以我们建议在宏的表达式也加上括号 #define DOUBLE( x) ( ( x ) ( x ) ) 3.2.3 宏替换规则  在程序中扩展#define定义符号和宏时需要涉及几个步骤。 1. 在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。如果是它们首先被替换。 2. 替换文本随后被插入到程序中原来文本的位置。对于宏参数名被他们的值所替换。 3. 最后再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果是就重复上述处理过程。 注意 1. 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏不能出现递归。 2. 当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索。   3.3 #和##的规则  我们先给一串代码 char* p hello bit\n; printf(hello bit\n); printf(%s, p); 我们发现字符串是有自动拼接的效果的 于是我们可以写出以下的代码 #define PRINT(FORMAT, VALUE)\ printf(the value is FORMAT\n, VALUE); ... PRINT(%d, 10); 这里只有当字符串作为宏参数的时候才可以把字符串放在字符串中。 1. 使用 # 把一个宏参数变成对应的字符串   int i 10; #define PRINT(FORMAT, VALUE)\ printf(the value of #VALUE is FORMAT \n, VALUE); ... PRINT(%d, i3);//产生了什么效果打印出 the value of i3 is 13 2.## 的作用 ##的作用是可以把##两边的符号合并,举例: #define ADD_TO_SUM(num, value) \ 续行符 sum##num value; ... ADD_TO_SUM(5, 10);//作用是给sum5增加10. 注:这样的连接必须产生一个合法的标识符,否则其结果就是未定义的.   3.带副作用的宏参数 x1;//不带副作用 x;//带有副作用   当宏参数在宏的定义中出现超过一次的时候如果参数带有副作用那么你在使用这个宏的时候就可能出现危险导致不可预测的后果.副作用就是表达式求值的时候出现的永久性效果. 举例: #define MAX(a, b) ( (a) (b) ? (a) : (b) ) ... x 5; y 8; z MAX(x, y); printf(x%d y%d z%d\n, x, y, z);//输出的结果是什么 预处理后产生替换 z ( (x) (y) ? (x) : (y)); 结果是 6 10 9 4. 宏和函数的对比 宏通常被应用于执行简单的运算,比如在两个数中找出较大的一个. 为啥不用函数呢?原因有两个: 宏的优势 1. 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。 所以宏比函数在程序的规模和速度方面更胜一筹。 2. 更为重要的是函数的参数必须声明为特定的类型。 所以函数只能在类型合适的表达式上使用。反之这个宏则可以适用于整形、长整型、浮点型等可以用于来比较的类型,宏是类型无关的 宏相比函数的劣势: 1.每次使用宏的时候一份宏定义的代码将插入到程序中。除非宏比较短否则可能大幅度增加程序的长度。 2. 宏是没法调试的 3.宏由于类型无关也就不够严谨。 4. 宏可能会带来运算符优先级的问题导致程序容易出现错.   宏能做而函数做不了的事情 宏的参数可以是类型,比如int char... #define MALLOC(num, type)\ (type *)malloc(num * sizeof(type)) ... //使用 MALLOC(10, int);//类型作为参数 //预处理器替换之后 (int *)malloc(10 * sizeof(int)); 5.命令行定义 许多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   6.#包含的头文件和自定义头文件的区别 自定义包含的头文件会先去工程路径下寻找文件,找不到就去标准路径下寻找文件,找不到就报错. 头文件直接去标准路径下寻找头文件,找不到就报错. 7.条件编译(类似于选择语句) 在编译一个程序的时候我们如果要将一条语句一组语句编译或者放弃是很方便的。因为我们有条件编译指令,因为有些代码在不同的情况下运行不同的代码.   1. #if 常量表达式 //... #endif //常量表达式由预处理器求值。 如 #define __DEBUG__ 1 #if __DEBUG__ //.. #endif 2.多个分支的条件编译 #if 常量表达式 //... #elif 常量表达式 //... #else //... #endif 3.判断是否被定义 #if defined(symbol) #ifdef symbol #if !defined(symbol) #ifndef symbol 4.嵌套指令 #if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif #elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif #endif
http://www.yutouwan.com/news/356345/

相关文章:

  • 传统网站和手机网站的区别是什么意思wordpress如何让页面显示一篇文章
  • 可道网站建设安全标准化建设网站
  • 深圳网站建设yuntianxia做学校教务处网站
  • 企业免费网站怎么自己做直播网站
  • 国家建设部网站注册工程师人员查询Wordpress和jamel
  • 建设领域信用系统网站学生处网站建设招标公告
  • 佛山网站建设运营网络互联网推广
  • 重庆联通的网站建设视频网站能备案吗
  • 网站开发人员应该用什么浏览器电脑版 做网站尺寸
  • 做爰的视频网站建一个大型网站多少钱
  • 南京自助建站软件wordpress 登录密码
  • 注册公司网站怎么收费怎样去推广自己的网店
  • 量个网站一个域名c++编程软件
  • 建设网站需要支付什么插件费用吗京东的网站建设
  • python小学生入门教程郑州网站优化公司
  • 韶关网站seo深圳seo博客
  • 深圳市哪些公司做网站好天堂 在线地址8
  • 建三江廉政建设网站wordpress没有登录口
  • 做暖暖网站惠州开发做商城网站建设哪家好
  • 网站备案 用假地址可以么成都制作网站
  • 手机官方网站泉州网站建设方案策划
  • asp网站导航怎么做给公司做门户网站多少钱
  • 百度的企业网站免费wordpress托管
  • 帮别人做网站赚多少钱多语言网站 推广
  • 做哪些网站不受法律保护电子商务的网站建设分析
  • 池州家居网站建设怎么样上海多语种建站
  • 做电脑壁纸的网站网站后台管理系统后缀
  • 网站开发入门书籍推荐dreamware怎么做网站
  • 西部数码里面如何建设自己的网站成都装修公司哪家口碑最好
  • 网站维护流程商业网线多少钱一年