• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 浅谈#ifndef,#define,#endif的作用和用法

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了ifndef/define/endif,ifndef else endif,ifndef endif,ifndef define,ifndef和define区别等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

问题: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
</div>

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

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

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

假设你的工程里面有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
</div>

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的作用和用法全部内容了,希望大家多多支持~

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28浅析顺序结构存储的栈
  • 2017-05-28C语言中#define与typedef的互换细节详解
  • 2017-05-28解析Linux下的时间函数:设置以及获取时间的方法
  • 2017-05-28将CString字符串输入转化成整数的实现方法
  • 2017-05-28C++如何实现DNS域名解析
  • 2017-05-28C++中的异常处理机制详解
  • 2017-05-28c语言生成随机uuid编码示例
  • 2017-05-28C语言中变量与其内存地址对应的入门知识简单讲解
  • 2017-08-30c语言一级指针
  • 2017-05-28c++版线程池和任务池示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言中static的作用及C语言中使用静态函数有何好处
    • C++中的单例模式介绍
    • 详解C++编程的多态性概念
    • C++跳转语句之Goto对变量定义的影响详解
    • c语言++放在前面和后面的区别分析
    • 浅谈防不胜防的unsigned int的运算
    • C字符串操作函数实现方法小结
    • C/C++程序开发中实现信息隐藏的三种类型
    • 浅析C++中前置声明的应用与陷阱
    • 关于C++中构造函数初始化成员列表的总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有