预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C语言头文件避免重复包含、#pragmaonce和#ifndef的区别一般情况下我们都是把函数声明、类定义、模板定义等写到一个头文件里需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。例如你想确保头文件max.h不会被重复包含则你可以采取如下的形式:第一条预处理命令是说如果MAXMIN_H不为真说明此文件没被包含过此命令后面的源代码有效(相当于:‘如果大门没关请您进来’);第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上不让第二个人进来)。最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。假定有以下几个头文件及其包含关系为:File1.hfile2.hfile3.hfile4.hfile5.hmain.cpp那么:file3.h包含file1.hfile2.hfile4.h包含file1.hfile2.hfile5.h包含file3.hfile4.h。就会导致在file5中对file1和file2的反复包含编译时就会报错。解决方法1:1:应用#ifndef#define#endif即每个文件在定义时都写成以下情势(以file1.h为例):#ifndefH_FILE1#defineH_FILE1#include<stdio.h>#include<math.h>…..#endifFile3.h:#ifndefH_FILE3#defineH_FILE3#include<stdio.h>#include<math.h>#inlcude”file1.h”#include”file2.h”…..#endif方法二:在每个文件的头部定义:#pragmaonce(用于解释本文件中的内容只应用一次)例:fiel1.h:#pragmaonce#include<stdio.h>#include<math.h>…..File3.h:#pragmaonce#include<stdio.h>#include<math.h>#include”file1.h”…..2、#pragmaonce和#ifndef的区别这是一个比较常用的指令只要在头文件的最开始加入这条指令就能够保证头文件被编译一次1)#pragmaonce用来防止某个头文件被多次include#pragmaonce是编译相关就是说这个编译系统上能用但在其他编译系统不一定可以也就是说移植性差不过现在基本上已经是每个编译器都有这个定义了。2)#ifndef#define#endif用来防止某个宏被多次定义。#ifndef#define#endif这个是C++语言相关这是C++语言中的宏定义通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的如果写的程序要跨平台最好使用这种方式1#ifndef方式和2#pragmaonce方式在能够支持这两种方式的编译器上二者并没有太大的区别但是两者仍然还是有一些细微的区别。方式一:#ifndef__SOMEFILE_H__#define__SOMEFILE_H__......//一些声明语句#endif方式二:#pragmaonce......//一些声明语句1)#ifndef的方式依赖于宏名字不能冲突这不光可以保证同一个文件不会被包含多次也能保证内容完全相同的两个文件不会被不小心同时包含。当然缺点就是如果不同头文件的宏名不小心“撞车”可能就会导致头文件明明存在编译器却硬说找不到声明的状况2)#pragmaonce则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件而不是指内容相同的两个文件。带来的好处是你不必再费劲想个宏名了当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝本方法不能保证他们不被重复包含。当然相比宏名碰撞引发的“找不到声明”的问题重复包含更容易被发现并修正。3)方式一由语言支持所以移植性好方式二可以避免名字冲突#pragmaonce方式产生于#ifndef之后因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifnd