c语言防止头文件重复,c++头文件出错
为了避免同一个文件被多次包含,C/C中有两种方法,一种是#ifndef,另一种是#pragma。
一次模式。这两种方法在能够支持它们的编译器中并没有太大的区别,但是它们之间还是有一些微妙的区别。
方法1:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
.//声明和定义语句
#endif
方法二:
#杂注一次
.//声明和定义语句
C/C语言标准支持#ifndef的方式。既能保证同一个文件不会被多次包含,又能保证两个内容完全相同的文件(或代码片段)不会被意外地同时包含。
当然,缺点是如果不同头文件中的宏名不小心“撞车”,可能会导致你看到头文件明明存在,编译器却坚持声明找不到。这种情况有时候很让人抓狂。
由于编译器每次都需要打开头文件来判断是否有重复的定义,ifndef在编译大型项目时会使编译时间相对较长,所以一些编译器逐渐开始支持#pragma。
曾经的路。
#杂注
一次一般由编译器保证:同一个文件不会被多次包含。注意,这里的“同一个文件”指的是一个物理文件,而不是两个内容相同的文件。您不能在头文件中编译一段代码。
一次声明,但仅用于文件。
好处是不用想一个宏名,当然也不会有什么宏名碰撞带来的奇怪问题。从而提高大型项目的编译速度。
相应的缺点是,如果一个头文件有多个副本,这种方法不能保证它们不会被重复包含。当然,与宏名冲突导致的“声明未找到”问题相比,这种重复包含很容易被发现和纠正。
#杂注
曾经在#ifndef之后应运而生,所以很多人可能连听都没听过。目前看来#ifndef更受尊重。因为C/C语言标准支持#ifndef,所以不受编译器的限制;和#pragma
Once mode不被一些老版本的编译器支持,一些支持的编译器打算去掉它,所以它的兼容性可能不够好。一般来说,程序员听到这个,都会选择#ifndef方法。为了让自己的代码“活”更久,他们通常宁愿降低一些编译性能。这是程序员的个性,当然这是题外话。
另请参阅将两者放在一起的用法:
#杂注一次
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
.//声明和定义语句
#endif
它似乎想兼有两者的优点。但是只要使用#ifndef,就有宏名冲突的危险,不支持#pragma是必然的。
Once的编译器报错了,所以混合两种方法似乎并不能带来更多的好处,反而会让一些不熟悉的人感到困惑。
选择哪种方式,你要知道两种方式,要看具体情况。只要有避免缺点的合理约定,我觉得两种方式都可以接受。这不再是标准或者编译器的责任,应该由程序员自己或者小范围的开发规范来完成。
Btw:我看到一些关于GNU的讨论似乎是针对GCC的。
3.4(及以上?)取消一次对#pragma的支持。其实我的GCC 3.4.2和GCC 4.1.1还是支持#pragma的。
曾经,连一个弃用警告都没有,但是GCC2.95会对#pragma产生影响
一旦提出警告。
VC6和更高版本也提供了对#pragma的访问
有了once模式的支持,这个功能应该基本稳定了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。