浅谈#ifndef,#define,#endif的作用和用法

 更新时间:2020年4月25日 17:33  点击:1545

问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译

========================================================

用法:

.h文件,如下:
#ifndef XX_H
#define XX_H
...
#endif

这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 。。

因为在第二次包含时 XX_H 已经有定义了,所以就不再 include了
-------------------------------------------------------

#ifndef GRAPHICS_H // 防止graphics.h被重复引用
#define GRAPHICS_H

#include <math.h> // 引用标准库的头文件
…
#include “myheader.h” // 引用非标准库的头文件
…
void Function1(…); // 全局函数声明
…
class Box // 类结构声明
{
…
};
#endif

-----------------------------------------------------

那是指你建立多个文件时,多个文件里都包含这个头文件
-----------------------------------------------------

给你举个例子,再顺便分析一下:

假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h

a.cpp的头部是:
#include "b.h "
#include "c.h "

b.h和c.h的头部都是:
#include "d.h "

而d.h里面有class D的定义。

这样一来,

编译器编译a.cpp的时候,先根据#include "b.h "去编译b.h这个问题,再根据b.h里面的#include "d.h ",去编译d.h的这个文件,这样就把d.h里面的class D编译了;

然后再根据a.cpp的第二句#include "c.h ",去编译c.h,最终还是会找到的d.h里面的class D,但是class D之前已经编译过了,所以就会报重定义错误。

加上ifndef/define/endif,就可以防止这种重定义错误。
--------------------------------------------------
-------------------------------------------------

1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。

不管你的头文件会不会被多个文件引用,你都要加上这个。

一般格式是这样的:

#ifndef <标识>
#define <标识>
......
......
#endif <标识>

在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。

#ifndef AAA
#define AAA
...
int i;
...
#endif

里面有一个变量定义在vc中链接时就出现了i重复定义的错误,而在c中成功编译。

原因:

(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.

(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。

(3).C语言和C++语言连接结果不同,可能(猜测)在进行编译的时候,C++语言将全局变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。

参考解决方法:

(1).把源程序文件扩展名改成.c。

(2).推荐解决方案: .h中只声明 extern int i;

在.cpp中定义

#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__ int i;
注意问题:变量一般不要定义在.h文件中。

以上就是小编为大家带来的浅谈#ifndef,#define,#endif的作用和用法全部内容了,希望大家多多支持猪先飞~

[!--infotagslink--]

相关文章

  • 浅谈关于C语言中#define的副作用

    这篇文章主要介绍了关于C语言中#define的副作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • typedef和#define的用法以及区别

    以下是对C/C++语言中,typedef和#define的用法以及区别进行了详细的介绍,需要的朋友可以过来参考下...2020-04-25
  • c++ 尽量不要使用#define 而是用const、enum、inline替换。

    为什么这么说呢?或许很多程序员已经习惯在文件开始使用大量的#define语句...2020-04-25
  • C语言#define拼接宏定义实现方式

    今天小编就为大家分享一篇C语言#define拼接宏定义实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别

    这篇文章主要介绍了C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别的相关资料,需要的朋友可以参考下...2020-04-25
  • C#中#define后面只加一个参数的解释

    今天小编就为大家分享一篇关于C#中#define后面只加一个参数的解释,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25
  • Define,const,static用法总结

    const定义的全局数据变量,其基本作用和define相同,但又在define的基础上增加了好多功能...2020-04-25
  • C/C++中宏定义(#define)

    #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。接下拉通过本文给大家分享C/C++中宏定义(#define)知识,需要的朋友参考下...2020-04-25
  • 详解C语言中的#define宏定义命令用法

    有的时候为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用就是方便程序段的定义和修改,下面就来详解C语言中的#define宏定义命令用法....2020-04-25
  • C++中const与#define的利弊分析

    C++中不但可以用define定义常量还可以用const定义常量,下面这篇文章主要给大家分析介绍了关于C++中const与#define的利弊,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-04-25
  • 全面了解#pragma once与 #ifndef的区别

    下面小编就为大家带来一篇全面了解#pragma once与 #ifndef的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • C/C++中的typedef和#define详解

    这篇文章主要介绍了C/C++中的typedef和#define详解的相关资料,需要的朋友可以参考下...2020-04-25
  • 详解C语言#define预处理宏定义

    本文主要介绍了C语言#define预处理宏定义,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • C# #define条件编译详解

    这篇文章主要介绍了C# #define条件编译,告诉大家#define是用来做什么?如何使用#define,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C语言编程技巧 关于const和#define的区别心得

    尽量用const和inline而不用#define这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:...2020-04-25
  • 浅谈#ifndef,#define,#endif的作用和用法

    下面小编就为大家带来一篇浅谈#ifndef,#define,#endif的作用和用法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • 关于define与C 的内存

    本文主要介绍了C语言中#define到底存在程序的哪个区,以及工作流程和效率与普通函数的区别,希望能帮助需要的小伙伴...2020-04-25
  • C语言中#define与typedef的互换细节详解

    本篇文章是对C语言中#define与typedef的互换细节进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • Linux c中define的用法小结

    学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种define,在学习的过程中将C语言中所出现的#define定义整理总结了一下,供大家借鉴和学习。...2020-04-25
  • 详解C++中typedef 和 #define 的区别

    这篇文章主要介绍了C++中typedef 与 #define 的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-06