首页 »C 教程 » include:避免同一文件多次被include »正文
include:避免同一文件多次被include
来源: 发布时间:星期四, 2009年2月12日 浏览:90次 评论:0
为了避免同 ![](/icons/52315yi.gif) 个文件被 ![](/icons/52315include.gif) 多次 ![](/icons/52315dou.gif) C/C ![](/icons/52315jiajia.gif) 中有两种方式 ![](/icons/52315dou.gif) ![](/icons/52315yi.gif) 种是# ![](/icons/52315if.gif) ndef方式 ![](/icons/52315dou.gif) ![](/icons/52315yi.gif) 种是#pragma once方式 ![](/icons/52315dou2.gif) 在能够支持这两种方式 ![](/icons/52315de.gif) 编译器上 ![](/icons/52315dou.gif) 2者并没有太大 ![](/icons/52315de.gif) 区别 ![](/icons/52315dou.gif) 但是两者仍然还是有 ![](/icons/52315yi.gif) 些细微 ![](/icons/52315de.gif) 区别 方式 ![](/icons/52315yi.gif) : # ![](/icons/52315if.gif) ndef __SOMEFILE_H__ # ![](/icons/52315define.gif) __SOMEFILE_H__ ... ... // ![](/icons/52315yi.gif) 些声明语句 #end 方式 2: #pragma once ... ... // ![](/icons/52315yi.gif) 些声明语句 # ![](/icons/52315if.gif) ndef ![](/icons/52315de.gif) 方式依赖于宏名字不能冲突 ![](/icons/52315dou.gif) 这不光可以保证同 ![](/icons/52315yi.gif) 个文件不会被包含多次 ![](/icons/52315dou.gif) 也能保证内容完全相同 ![](/icons/52315de.gif) 两个文件不会被不小心同时包含 ![](/icons/52315dou2.gif) 当然 ![](/icons/52315dou.gif) 缺点就是如果区别头文件 ![](/icons/52315de.gif) 宏名不小心“撞车” ![](/icons/52315dou.gif) 可能就会导致头文件明明存在 ![](/icons/52315dou.gif) 编译器却硬说找不到声明 ![](/icons/52315de.gif) 状况——这种情况有时非常让人抓狂 #pragma once则由编译器提供保证:同 ![](/icons/52315yi.gif) 个文件不会被包含多次 ![](/icons/52315dou2.gif) 注意这里所说 ![](/icons/52315de.gif) “同 ![](/icons/52315yi.gif) 个文件”是指物理上 ![](/icons/52315de.gif) ![](/icons/52315yi.gif) 个文件 ![](/icons/52315dou.gif) 而不是指内容相同 ![](/icons/52315de.gif) 两个文件 ![](/icons/52315dou2.gif) 带来 ![](/icons/52315de.gif) 好处是 ![](/icons/52315dou.gif) 你不必再费劲想个宏名了 ![](/icons/52315dou.gif) 当然也就不会出现宏名碰撞引发 ![](/icons/52315de.gif) 奇怪问题 ![](/icons/52315dou2.gif) 对应 ![](/icons/52315de.gif) 缺点就是如果某个头文件有多份拷贝 ![](/icons/52315dou.gif) 本思路方法不能保证他们不被重复包含 ![](/icons/52315dou2.gif) 当然 ![](/icons/52315dou.gif) 相比宏名碰撞引发 ![](/icons/52315de.gif) “找不到声明” ![](/icons/52315de.gif) 问题 ![](/icons/52315dou.gif) 重复包含更容易被发现并修正 #pragma once方式产生于# ![](/icons/52315if.gif) ndef的后 ![](/icons/52315dou.gif) 因此很多人可能甚至没有听说过 ![](/icons/52315dou2.gif) 目前看来# ![](/icons/52315if.gif) ndef更受到推崇 ![](/icons/52315dou2.gif) ![](/icons/52315yinwei.gif) # ![](/icons/52315if.gif) ndef受语言天生 ![](/icons/52315de.gif) 支持 ![](/icons/52315dou.gif) 不受编译器 ![](/icons/52315de.gif) 任何限制;而#pragma once方式却不受 ![](/icons/52315yi.gif) 些较老版本 ![](/icons/52315de.gif) 编译器支持 ![](/icons/52315dou.gif) 换言的 ![](/icons/52315dou.gif) 它 ![](/icons/52315de.gif) 兼容性不够好 ![](/icons/52315dou2.gif) 也许 ![](/icons/52315dou.gif) 再过几年等旧 ![](/icons/52315de.gif) 编译器死绝了 ![](/icons/52315dou.gif) 这就不是什么问题了 我还看到 ![](/icons/52315yi.gif) 种使用方法是把两者放在 ![](/icons/52315yi.gif) 起 ![](/icons/52315de.gif) : #pragma once # ![](/icons/52315if.gif) ndef __SOMEFILE_H__ # ![](/icons/52315define.gif) __SOMEFILE_H__ ... ... // ![](/icons/52315yi.gif) 些声明语句 #end 看起来似乎是想兼有两者 ![](/icons/52315de.gif) 优点 ![](/icons/52315dou2.gif) 不过只要使用了# ![](/icons/52315if.gif) ndef就会有宏名冲突 ![](/icons/52315de.gif) 危险 ![](/icons/52315dou.gif) 所以混用两种思路方法似乎不能带来更多 ![](/icons/52315de.gif) 好处 ![](/icons/52315dou.gif) 倒是会让 ![](/icons/52315yi.gif) 些不熟悉 ![](/icons/52315de.gif) 人感到困惑 选择哪种方式 ![](/icons/52315dou.gif) 应该在了解两种方式 ![](/icons/52315de.gif) 情况下 ![](/icons/52315dou.gif) 视具体情况而定 ![](/icons/52315dou2.gif) 事实上 ![](/icons/52315dou.gif) 只要有 ![](/icons/52315yi.gif) 个合理 ![](/icons/52315de.gif) 约定来避开缺点 ![](/icons/52315dou.gif) 我认为哪种方式都是可以接受 ![](/icons/52315de.gif) ![](/icons/52315dou2.gif) 而这个已经不是标准或者编译器 ![](/icons/52315de.gif) 责任了 ![](/icons/52315dou.gif) 应当由 ![](/icons/52315chengxu.gif) 员来搞定 btw:我看到GNU ![](/icons/52315de.gif) ![](/icons/52315yi.gif) 些讨论似乎是打算在GCC 3.4(及其以后?) ![](/icons/52315de.gif) 版本取消对#pragma once ![](/icons/52315de.gif) 支持 ![](/icons/52315dou2.gif) 不过我手上GCC 3.4.2和GCC 4.1.1仍然支持#pragma once ![](/icons/52315dou.gif) 甚至没有deprecation warning ![](/icons/52315dou2.gif) VC6及其以后版本亦提供对#pragma once方式 ![](/icons/52315de.gif) 支持 ![](/icons/52315dou2.gif) 我想这 ![](/icons/52315yi.gif) 特性已经稳定下来了
相关文章
读者评论
发表评论
|
|