(转)#ifndef的用法

原文链接:http://wenku.baidu.com/link?url=c4doqVo3U429RkwTN5eaJIfD2rEu-1bLKKQXuqO8drmL359PhUjVmzC7P94wBY90bqYjPBRiuujahij4AM_06OkiOThB3v91fXexqpIukG_

定义 
#ifndef x  

#define x    

...   

#endif 
  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。   

#ifndef x 
  //先测试x是否被宏定义过   

#define x  
  //如果没有宏定义下面就宏定义x并编译下面的语句 

  ...  

 #endif 
  //如果已经定义了则编译#endif后面的语句 
  条件指示符#ifndef检查预编译常量在前面是否已经被宏定义。如果在前面没有被宏定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句都被包含进来进行编译处理。相反,如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。

补充一些内容  
  千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。  
  还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:    #ifndef <标识>    #define <标识>    ......    #endif  
  <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

  #ifndef _STDIO_H_  

  #define _STDIO_H_    ......  

#endif 
#ifndef xxx//如果没有定义xxx #define xxx//定义xxx #endif //结束如果 
这个用法主要是在头文件中,主要是为了防止类重复的include,所以在类的头文件之前加上前面两个,用类名替代xxx,在最后加上最后一句。 const 与 #define的比较 
    C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点: 
(1)       const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。 
 
(2)       有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。 
        在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

转载于:https://www.cnblogs.com/zywscq/p/4957408.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV与图像处理学习十——区域生长算法(含代码)

OpenCV与图像处理学习十——区域生长算法&#xff08;含代码&#xff09;一、区域生长算法概要二、区域生长算法原理三、代码应用一、区域生长算法概要 区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发&#xff0c;按照一定的准则&#xff0c;逐步加入…

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated

使用scipy模块时出现警告&#xff1a;FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use arr[tuple(seq)] instead of arr[seq]. In the future this will be interpreted as an array index, arr[np.array(seq)], which will resu…

一文看懂中国MEMS传感器产业链

来源&#xff1a;通信产业网物联网对促进我国经济发展、优化产业结构具有重大的战略意义。而在整个物联网生态中&#xff0c;MEMS传感器扮演着越来越重要的角色&#xff0c;在即将到来的智能物联网时代中将起到核心作用&#xff0c;为新科技产品提供更智能、更敏锐的感知能力。…

stream iterators源代码详解

所谓stream iterators&#xff0c;可以将迭代器绑定到一个stream&#xff08;数据流&#xff09;对象身上。绑定istream对象&#xff08;例如&#xff1a;std:cin)&#xff0c;称为 istream_iterator,拥有输入能力。乍听之下真神奇。所谓绑定一个istream object&#xff0c;其实…

OpenCV与图像处理学习十一——分水岭算法(含代码)

OpenCV与图像处理学习十一——分水岭算法&#xff08;含代码&#xff09;一、分水岭算法概要二、分水岭算法步骤三、代码应用一、分水岭算法概要 任意的灰度图像可以被看做是地质学表面&#xff0c;高亮度的地方是山峰&#xff0c;低亮度的地方是山谷。 给每个孤立的山谷&…

python清空文件夹

要清空一个文件夹&#xff0c;可以通过删除该文件夹再新建一个一样的文件夹来达到清空文件夹的效果 import os import shutilshutil.rmtree(dirpath) # 能删除该文件夹和文件夹下所有文件 os.mkdir(dirpath)

10件5G能实现但4G不能做的事情

来源&#xff1a;雷锋网 5G的一些最佳用途可能还没有被发现&#xff0c;但下面是我们已经知道的十个令人兴奋的用途。雷锋网按&#xff1b;2019年6月6日&#xff0c;工信部正式向中国电信、中国移动、中国联通、中国广电发放5G商用牌照&#xff0c;这表明中国正式进入了5G商用的…

【VS开发】CString 转为 char *方法大全

【VS开发】CString 转为 char *方法大全 标签&#xff08;空格分隔&#xff09;&#xff1a; 【VS开发】 方法1&#xff1a; CString strTemp; char szTemp[128];strTemp _T("abckdkfei"); memset( szTemp, 0, sizeof(szTemp) ); strcpy( szTemp, strTemp.GetBuffer…

OpenCV与图像处理学习十二——图像形状特征之HOG特征

OpenCV与图像处理学习十二——图像形状特征之HOG特征一、图像特征理解1.1 颜色特征1.2 纹理特征1.3 形状特征1.4 空间关系特征二、形状特征描述2.1 HOG特征2.1.1 基本概念2.1.2 HOG实现过程2.1.3 代码实现前面介绍了图像的基础知识、基本处理方法以及传统图像分割的应用&#x…

python删除文件

import osif os.path.exists(path):os.remove(path)

深度解读:5G正式发牌,国内通信市场冷暖预判

来源&#xff1a;ICT解读者2019年6月6日&#xff0c;工业和信息化部向中国电信、中国移动、中国联通和中国广电正式颁发5G牌照&#xff0c;批准四家企业经营“第五代数字蜂窝移动通信业务”。这标志着我国正式进入5G商用元年。一石激起千层浪&#xff0c;相较于此前各运营商官方…

OpenCV与图像处理学习十三——Harris角点检测(含代码)

OpenCV与图像处理学习十三——Harris角点检测&#xff08;含代码&#xff09;一、角点的概念二、Harris角点检测的实现过程三、Harris代码应用一、角点的概念 角点&#xff1a; 在现实世界中&#xff0c; 角点对应于物体的拐角&#xff0c; 道路的十字路口、 丁字路口等。 从…

wpf prism IRegionManager 和IRegionViewRegistry

引入了一个新的问题&#xff0c;IRegionViewRegistry和IRegionManager都具有RegisterViewWithRegion方法&#xff0c;二者有区别么&#xff1f; 答案是——没有。我们已经分析过&#xff0c;在UnityBootstrapper的中&#xff0c;已经默认建立了IRegionManager和RegionManager的…

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

python表示条件之间的逻辑与除了用and还可以用&&#xff0c;把and换成&即可

ubuntu zip解压

您好&#xff0c;zip xx.zip压缩&#xff0c;unzip xx.zip 解压&#xff0c;tar zcvf xx.tar.gz压缩tar zxvf xx.tar.gz解压转载于:https://www.cnblogs.com/zxouxuewei/p/4973319.html

Go map如何排序

1. 将key 或 value 单独组成其类型的切片或数组&#xff0c;进行排序 package mainimport ("fmt""sort" )func main() {table : map[string]string{"hello": "hello","world": "world","a": "…

德勤发布《中国智能制造分析报告》

来源&#xff1a;CIO俱乐部亚洲正受到自动化、智能化大潮冲击。国际劳工组织调研发现&#xff0c;越南、柬埔寨、菲律宾和印度尼西亚的工人的失业风险最高&#xff0c;据估计这几个区域约50%的工人工作可能在未来20年被自动化取代。亚洲尤其是中国作为制造业的重要区域&#xf…

OpenCV与图像处理学习十四——SIFT特征(含代码)

OpenCV与图像处理学习十四——SIFT特征&#xff08;含代码&#xff09;一、SIFT算法二、SIFT实现过程三、代码实现一、SIFT算法 SIFT&#xff0c; 即尺度不变特征变换算法&#xff08;Scale-invariant feature transform&#xff0c;SIFT&#xff09; &#xff0c; 是用于图像…

tf.TensorArray

TensorArray可以看做是具有动态size功能的Tensor数组。通常都是跟while_loop或map_fn结合使用。 ta tf.TensorArray(size, dtype, dynamic_sizeTrue) # dynamic_size指定数组长度可变 ta.stack(nameNone) # 将TensorArray中元素叠起来当做一个Tensor输出 ta.unstack(value,…

液态大脑与固态大脑——圣塔菲最新群体智能文集

来源&#xff1a;The Royal society撰文 | Ricard Sol, Melanie Moses, and Stephanie Forrest大脑&#xff0c;神经元构成的器官根植于许多生物体内。这是一种固态的大脑&#xff0c;且组成它们的元素在空间中相对固定。但是相对的&#xff0c;大脑是否可以拥有流动不定的存在…