头文件中的ifndefdefineendif什么用处?

头文件中的ifndefdefineendif什么用处?,第1张

ifndef和endif是一对条件预编译语句,给你一个例子:

ifndef  abc//意思是如果没有定义abc这个特征符,则编译之后到endif之前的语句否则略过

//defineabc这条语句;

defineabc

endif

比如有一段代码,有时需要根据需要不进行编译或进行编译,如以下代码:

ifdef  abc;

某段代码;

endif

意思就是如果程序中定义了abc特征符,则编译这里所说的"某段代码”,否则不进行编译,

如果程序是这样:

ifndef  abc;

defineabc

endif

ifdef  abc;

某段代码;

endif

则这里所说的“某段代码”肯定会被编译,因为在设计程序之初,可能需要根据某个条件来决定是否编译“某段代码”,但是后来发现,这样的条件编译已经没有必要,而且必须要编译“某段代码”,两种办法,一种是把ifdef  abc和endif去掉;另一种就像这里一样,在

ifdef  abc;

某段代码;

endif

之前加

ifndef  abc;

defineabc

endif

一般在一个应用开发体系中,功能的真正逻辑实现是以硬件层为基础,在驱动程序、功能层程序以及用户的应用程序中完成的。头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。(eg.C++编译模式[1]  )

从以上结构图来看,头文件是用户应用程序和函数库之间的桥梁和纽带。在整个软件中,头文件不是最重要的部分,但它是C语言家族中不可缺少的组成部分。编译时,编译器通过头文件找到对应的函数库,进而把已引用函数的实际内容导出来代替原有函数。进而在硬件层面实现功能。

从以上例子可以看出,头文件一般由四部分内容组成:(1)头文件开头处的版权和版本声明;(2)预处理块;(3)inline函数的定义;(4)函数和类结构声明等。在头文件中,用ifndef/define/endif结构产生预处理块,用#include格式来引用库的头文件。头文件的这种结构,是利用C语言进行开发软件所通常具备的,属于公有知识。

if就是如果\x0d\x0andef就notdef就是notdefine就是未定义。\x0d\x0adefine就是定义\x0d\x0aendif就是结束如果。\x0d\x0a#如果未定义xxxx.h\x0d\x0a#则定义xxxx.h\x0d\x0a??\x0d\x0a#结束如果。\x0d\x0a\x0d\x0a这样的话,在多个文件同时包含该头文件时就不会出现重复定义的错误,否则就会提示重复定义。

在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误。在头文件中实用#ifndef

#define

#endif能避免头文件的重定义。

方法:例如要编写头文件test.h

在头文件开头写上两行:

#ifndef

_TEST_H

#define

_TEST_H//一般是文件名的大写

头文件结尾写上一行:#endif这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。

分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行

)#ifndef

_TEST_H和#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef

_TEST_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义了。主要用于防止重复定义宏和重复包含头文件


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11665239.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存