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

站长素材官网可信验证网站

站长素材官网,可信验证网站,网站开发费用属无形资产吗,影楼微网站建设3. 预处理详解 3.2#define 3.2.5带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候#xff0c;如果参数带有副作用#xff0c;那么你在使用这个宏的时候就可能 出现危险#xff0c;导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。 例如…3. 预处理详解 3.2#define 3.2.5带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候如果参数带有副作用那么你在使用这个宏的时候就可能 出现危险导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。 例如 x1;//不带副作用 x;//带有副作用 MAX宏可以证明具有副作用的参数所引起的问题。 #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)); 所以输出的结果是 x6 y10 z9  3.2.6 宏和函数对比  宏通常被应用于执行简单的运算。 比如在两个数中找出较大的一个。 #define MAX(a, b) ((a)(b)?(a):(b)) 那为什么不用函数来完成这个任务 原因有二 1. 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。          所以宏比函数在程序的规模和速度方面更胜一筹。 2. 更为重要的是函数的参数必须声明为特定的类型。 所以函数只能在类型合适的表达式上使          ·用。反之这个宏怎可以适用于整形、长整型、浮点型等可以 用于来比较的类型。 宏是类型无关的。  宏的缺点当然和函数相比宏也有劣势的地方 1. 每次使用宏的时候一份宏定义的代码将插入到程序中。除非宏比较短否则可能大幅度          增加程序 的长度。 2. 宏是没法调试的。 3. 宏由于类型无关也就不够严谨。 4. 宏可能会带来运算符优先级的问题导致程容易出现错。 宏有时候可以做函数做不到的事情。比如宏的参数可以出现类型但是函数做不到。 #define MALLOC(num, type)\(type *)malloc(num * sizeof(type)) ... //使用 MALLOC(10, int);//类型作为参数 //预处理器替换之后 (int *)malloc(10 * sizeof(int)); 宏                        函数 1.计算                         1.函数的调用 2.计算 3.函数的返回 宏和函数的一个对比  属 性 #define定义宏函数 代 码 长 度 每次使用时宏代码都会被插入到程序中。除了非常 小的宏之外程序的长度会大幅度增长函数代码只出现于一个地方每 次使用这个函数时都调用那个 地方的同一份代码 执 行 速 度 更快存在函数的调用和返回的额外开 销所以相对慢一些 操 作 符 优 先 级 宏参数的求值是在所有周围表达式的上下文环境里 除非加上括号否则邻近操作符的优先级可能会产生 不可预料的后果所以建议宏在书写的时候多些括 号。函数参数只在函数调用的时候求 值一次它的结果值传递给函 数。表达式的求值结果更容易预 测。 带 有 副 作 用 的 参 数 参数可能被替换到宏体中的多个位置所以带有副作 用的参数求值可能会产生不可预料的结果。函数参数只在传参的时候求值一 次结果更容易控制。参 数 类 型宏的参数与类型无关只要对参数的操作是合法的 它就可以使用于任何参数类型。函数的参数是与类型有关的如 果参数的类型不同就需要不同 的函数即使他们执行的任务是 不同的。调 试宏是不方便调试的函数是可以逐语句调试的递 归宏是不能递归的函数是可以递归的 建议 如果逻辑比较简单可以使用宏来实现 但是如果计算逻辑比较复杂就使用函数 3.2.7 命名约定 一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是 把宏名全部大写 函数名不要全部大写 3.3 #undef  这条指令用于移除一个宏定义。 #undef NAME //如果现存的一个名字需要被重新定义那么它的旧名字首先要被移除。 #define M 100int main() {int m M;printf(m%d\n, m);#undef Mint n M;printf(%d\n, m);return 0; } 3.4 命令行定义 许多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  3.5 条件编译 在编译一个程序的时候我们如果要将一条语句一组语句编译或者放弃是很方便的。因为我们有条件编译指令。 比如说         调试性的代码删除可惜保留又碍事所以我们可以选择性的编译。 #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__ 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 #endif3.6 文件包含 我们已经知道 #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样。 这种替换的方式很简单 预处理器先删除这条指令并用包含文件的内容替换。 这样一个源文件被包含10次那就实际被编译10次。 3.6.1 头文件被包含的方式 本地文件包含 #include filename 查找策略先在源文件所在目录下查找如果该头文件未找到编译器就像查找库函数头文件一样在标 准位置查找头文件。 如果找不到就提示编译错误。  Linux环境的标准头文件的路径 /usr/include VS环境的标准头文件的路径  C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include  注意按照自己的安装路径去找。  库文件包含 #include  filename.h 查找头文件直接去标准路径下去查找如果找不到就提示编译错误。 这样是不是可以说对于库文件也可以使用 “” 的形式包含 答案是肯定的可以。  但是这样做查找的效率就低些当然这样也不容易区分是库文件还是本地文件了。 3.6.2 嵌套文件包含  如果出现这样的场景 comm.h和comm.c是公共模块。 test1.h和test1.c使用了公共模块。 test2.h和test2.c使用了公共模块。 test.h和test.c使用了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。  如何解决这个问题 答案条件编译。  #error #pragma #line ...每个头文件的开头写 #ifndef __TEST_H__ #define __TEST_H__ //头文件的内容 #endif //__TEST_H__ 或者 #pragma once 就可以避免头文件的重复引入。 4. 其他预处理指令  #error #pragma #line ...
http://www.pierceye.com/news/440471/

相关文章:

  • 被骗去国外做网站网站推广网站的运营推广方案
  • 北京汽车业务网站开发公司桂林旅游攻略必去景点
  • 个人网站开发是学什么语言wordpress打造cms
  • 网站建设与维护的重要性岳阳建设厅网站
  • 惠州网站开发公司wordpress简单
  • 外贸网站 免费模板 使用 zencart如何购买域名和备案
  • 网站建设联系我们设计网站无锡
  • 深圳做网站好的公司wordpress建菜单
  • 网站编辑需要的技能做网站需要什么域名
  • 营销型网站建设目的和意义网站托管方案
  • 网站感谢页面企业标志图片大全
  • 响应式网站建设必推全网天下邵阳竞价网站建设设计
  • 大连网站如何制作辽阳公司做网站
  • 百度站长怎么验证网站jekyll做公司网站
  • 电子商务公司建设网站方案设计网站建设开发背景
  • 同一产品做多个网站山西省住房和城乡建设厅官网
  • 网站建设的流程是什么意思微信小程序的代码
  • 广州网站整站优化html项目案例实战
  • 宁波网站推广方式seo优化按天扣费
  • 紫金优化网站制作python编程100例
  • 原阳网站建设哪家好域名网址
  • 西安学校网站建设wordpress手机端模板下载
  • 泉州网站建设工作室网站上的产品板块
  • 平顶山网站网站建设网页设计与制作教程 刘瑞信 pdf
  • 网站开发深天津设计公司排行榜
  • 做tcf法语听力题的网站公司网页简介
  • 十堰做网站最专业的公司深圳企业网查询
  • 购物网站大全排名调查drupal与wordpress哪个容易
  • 网站建设彳金手指排名网站开发完没人运营
  • 网站建设是设开发公司质量管理流程