18.4 #if 0…endif的用途
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的用途的更多相关文章
- linux(centos8):prometheus使用alertmanager发送报警邮件(prometheus 2.18.1/alertmanager 0.20.0)
一,alertmanager的用途 1,Alertmanager的作用: Alertmanager是一个独立的报警模块, 它接收Prometheus等客户端发来的警报,并通过分组.删除重复等处理, 通 ...
- LinuxMint 18 编译cm13.0 笔记
1.安装依赖文件 sudo apt--dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zlib1g-d ...
- 【原创】大叔经验分享(18)hive2.0以后通过beeline执行sql没有进度信息
一 问题 在hive1.2中使用hive或者beeline执行sql都有进度信息,但是升级到hive2.0以后,只有hive执行sql还有进度信息,beeline执行sql完全silence,在等待结 ...
- struct中长度为0的数组用途与原理
前言 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNUC中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0]; 很多人可能觉得不可思议,长度为0的数组是没有什么意义的, ...
- Activiti6.0教程 Service用途剖析 (二)
这节我们学习下Activiti的7大对象,首先我们从ProcessEngine接口开始看. /* Licensed under the Apache License, Version 2.0 (the ...
- 万答#18,MySQL8.0 如何快速回收膨胀的UNDO表空间
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 背 ...
- #if 0 #endif && #if 1 #endif ----待整理
在看一个 usbcan 的上位机例程中发现了这个,于是百度下,记录下来.(参考:http://nevel.cnblogs.com/p/6378035.html)
- “#if 0/#if 1 ... #endif”的作用
1. "#if 0/#if 1 ... #endif"的作用,我们知道,C标准不提供C++里的"//"这样的单行风格注释而只提供"/* */" ...
- 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. ...
随机推荐
- Go语言开发Prometheus Exporter示例
一.Prometheus中的基本概念 Prometheus将所有数据存储为时间序列,这里先来了解一下prometheus中的一些基本概念 指标名和标签每个时间序列都由指标名和一组键值对(也称为标签)唯 ...
- ml交叉验证
https://blog.csdn.net/guanyuqiu/article/details/86006474 https://blog.csdn.net/weixin_42660173/artic ...
- C++中数组声名后不初始化,数组里的值都是0吗?
这得看数组的申明情况: 1.全局/静态数组 如果申明的是全局/静态数组,系统会把数组的内容自动初始化为0. 2.局部数组 如果申明的是局部数组,数组的内容会是随机的,不一定是0.如函数内声明: int ...
- js实现下雪雪花特效
两种下雪特效: 1. <script type="text/javascript"> (function($){ $.fn.snow = function(option ...
- Java反序列化漏洞实现
一.说明 以前去面试被问反序列化的原理只是笼统地答在参数中注入一些代码当其反序列化时被执行,其实“一些代码”是什么代码“反序列化”时为什么就会被执行并不懂:反来在运营商做乙方经常会因为java反反序列 ...
- windows下《Go Web编程》之Go开发工具
Go开发工具很多,比较喜欢的使用作者列出的第一个工具,LiteIDE.它是一款专门为Go语言开发的跨平台轻量级集成开发环境. 一.LiteIDE下载安装 下载地址:https://sourceforg ...
- Python中的装饰器的简单介绍02
这篇博文转载自伯乐在线的12步轻松搞定python装饰器,重构成python3. 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例 ...
- Saiku本地编译运行后Debug调试(十二)
Saiku源码拉下来在本地编译通过,然后想进行单元测试 发现不知道怎么写测试类了... 幸好有同事大佬的帮助,教了一招哈哈哈哈... 1.将本地编译通过的Saiku打包好(mvn clean inst ...
- 指导手册03:Hadoop基础操作
指导手册03:Hadoop基础操作 Part 1:查看Hadoop集群的基本信息1.查询存储系统信息(1)在WEB浏览器的地址栏输入http://master:50070/ 请查看自己的Hadoop集 ...
- FPGA型号解读