18.4.1 #if 0…#endif的用途

  #if 0 ... #endif的作用和/*...*/的作用是一样的,就是注释!

  可是为什么不用注释符号/*?

  答:为了解决嵌套注释。例子如下:

#include“stdio.h”
int main()
{
  int a=;
  /*这是一个外层注释
/*
int *b=&a; //这是一个内层代码注释
*b = 10;
*/
  a++;
*/
}

上面的程序编译后发现缺少了一个注释符号,因为注释符头 " / *  "是根据最近结束符 " */  "来判断注释的区域的,但是一但内嵌了就会发现错误。所以就使用了#if 0。如下:

#include“stdio.h”
int main()
{
  int a=;
/*这是一个外层注释
#if 0
  int *b=&a; //这是一个内层代码注释
*b = 10;
#endif
a++;
*/
}

在有些地方很常见到它,而且少不了它。当你见识过Linux系统的源代码就明白了。

#if 0…endif主要用于系统裁剪。

系统裁剪是针对系统的用途,对系统的源代码进行一下优化,减少不必要的功能。

#include“stdio.h”
#define TEST 1
int main()
{
  int a=;
/*这是一个外层注释
#if TEST
int *b=&a;
*b = 10;
#endif
a++;
*/
}

如上面的例子,对于某些功能不需要,我们只需对于的功能TEST的宏定义改成0,然后重新编译就行了。当然一般宏定义是放在一个特定的.h文件里,这样只需要更改那个文件所对应的值就可以对系统进行裁剪而不需要关心具体代码。

18.4.2 #ifndef、#define、#endif的用途

  看到很多程序的头文件写:

  #ifndef HeaderName_h

  #define HeaderName_h

    //这里面通常写各种宏定义、其他头文件的包含

  #endif

  这样做的目的:防止该头文件被重复引用。

  什么是“头文件被重复引用”?

  答:其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。

  比如:存在a.h文件#include "c.h",而b.cpp文件同时#include "a.h" 和#include "c.h",此时就会造成c.h被b.cpp重复引用。

  头文件被重复引用引起的后果:

  有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些。但是有些头文件重复包含,则会引起错误,比如:在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的),这种头文件重复包含会引起全局变量的重复定义


18.4 #if 0…endif的用途的更多相关文章

  1. linux(centos8):prometheus使用alertmanager发送报警邮件(prometheus 2.18.1/alertmanager 0.20.0)

    一,alertmanager的用途 1,Alertmanager的作用: Alertmanager是一个独立的报警模块, 它接收Prometheus等客户端发来的警报,并通过分组.删除重复等处理, 通 ...

  2. LinuxMint 18 编译cm13.0 笔记

    1.安装依赖文件 sudo apt--dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zlib1g-d ...

  3. 【原创】大叔经验分享(18)hive2.0以后通过beeline执行sql没有进度信息

    一 问题 在hive1.2中使用hive或者beeline执行sql都有进度信息,但是升级到hive2.0以后,只有hive执行sql还有进度信息,beeline执行sql完全silence,在等待结 ...

  4. struct中长度为0的数组用途与原理

    前言 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNUC中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0]; 很多人可能觉得不可思议,长度为0的数组是没有什么意义的, ...

  5. Activiti6.0教程 Service用途剖析 (二)

    这节我们学习下Activiti的7大对象,首先我们从ProcessEngine接口开始看. /* Licensed under the Apache License, Version 2.0 (the ...

  6. 万答#18,MySQL8.0 如何快速回收膨胀的UNDO表空间

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 背 ...

  7. #if 0 #endif && #if 1 #endif ----待整理

    在看一个 usbcan 的上位机例程中发现了这个,于是百度下,记录下来.(参考:http://nevel.cnblogs.com/p/6378035.html)

  8. “#if 0/#if 1 ... #endif”的作用

    1. "#if 0/#if 1 ... #endif"的作用,我们知道,C标准不提供C++里的"//"这样的单行风格注释而只提供"/* */" ...

  9. c语言中“#if 0 / #if 1 ... #endif”的作用

    原帖地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2028608&bbs_page_no=1005&bbs_id=9999 1. ...

随机推荐

  1. Rancher 容器管理平台-免费视频培训-链接及内容-第三季

    Rancher 容器管理平台-免费视频培训-链接及内容 第三季 第5期-2018年05月10日-持续集成的容器化实践回放网址:http://www.itdks.com/liveevent/detail ...

  2. [easyUI] autocomplete 简单自动完成以及ajax从服务器端完成

    通过id取input标签对象,调用autocomplete方法 <script> var sources = [ "ActionScript", "Apple ...

  3. arch Linux 安装完,无法通过 SSH 远程连接 root 用户问题

    访问 arch Linux 主机的该文件 [root@eric-laptop ~]# vim /etc/ssh/sshd_config 对应注释部分后边补上下边三行: LoginGraceTime 1 ...

  4. 第二周javaweb学习进度表

      第一周 所花时间 三天 代码量 200行 博客量 3篇 知识点了解到的 学习到了HTML编程语言的相关知识比如checkbox复选框和radio单选按钮以及form表单的使用方法,form表单可以 ...

  5. 小程序组件 scroll-view 滑动

    小程序组件 scroll-view 中分别有上下竖向滑动和左右横向滑动之分,在这次项目中刚好需要用到横向滑动,但在测试过程中发现横向滑动没有了效果(静止在那里没移动过),经调试发现: 1.scroll ...

  6. PAT 1058 A+B in Hogwarts

    1058 A+B in Hogwarts (20 分)   If you are a fan of Harry Potter, you would know the world of magic ha ...

  7. 如何在linux下开启FTP服务

    如何在linux下开启FTP服务 1. 首先服务器要安装ftp软件,查看是否已经安装ftp软件下:   #which vsftpd   如果看到有vsftpd的目录说明服务器已经安装了ftp软件 2. ...

  8. 大雄的elk实践

    目录 一.ElK环境搭建 1.1.elasticsearch 1..kibana 1..logstash二.elk实践 2.1 使用elk分析nginx日志 一.ElK环境搭建   1.1 elast ...

  9. es _cat API

    1.集群健康 curl -X GET "10.0.38.111:1200/_cluster/health?pretty"

  10. 配置阿里云docker镜像地址

    { "registry-mirrors": [ "https://kfwkfulq.mirror.aliyuncs.com", "https://2l ...