C小加
厚德 博學 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
#pragma once 與 #ifndef 解析(轉)
Posted on 2013-03-18 10:28
C小加
閱讀(6875)
評論(2)
編輯
收藏
引用
所屬分類:
C++和面向對象
轉自:
http://blog.csdn.net/slimfox/article/details/1565950
為了避免同一個文件被include多次,C/C++中有兩種方式,一種是#ifndef方式,一種是#pragma once方式。在能夠支持這兩種方式的編譯器上,二者并沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif
方式二:
#pragma once
... ... // 一些聲明語句
#ifndef的方式依賴于宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心“撞車”,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況——這種情況有時非常讓人抓狂。
#pragma once則由編譯器提供保證:同一個文件不會被包含多次。注意這里所說的“同一個文件”是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你不必再費勁想個宏名了,當然也就不會出現宏名碰撞引發的奇怪問題。對應的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復包含。當然,相比宏名碰撞引發的“找不到聲明”的問題,重復包含更容易被發現并修正。
#pragma once方式產生于#ifndef之后,因此很多人可能甚至沒有聽說過。目前看來#ifndef更受到推崇。因為#ifndef受語言天生的支持,不受編譯器的任何限制;而#pragma once方式卻不受一些較老版本的編譯器支持,換言之,它的兼容性不夠好。也許,再過幾年等舊的編譯器死絕了,這就不是什么問題了。
我還看到一種用法是把兩者放在一起的:
#pragma once
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif
看起來似乎是想兼有兩者的優點。不過只要使用了#ifndef就會有宏名沖突的危險,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑。
選擇哪種方式,應該在了解兩種方式的情況下,視具體情況而定。事實上,只要有一個合理的約定來避開缺點,我認為哪種方式都是可以接受的。而這個已經不是標準或者編譯器的責任了,應當由程序員來搞定。
btw:我看到GNU的一些討論似乎是打算在GCC 3.4(及其以后?)的版本取消對#pragma once的支持。不過我手上GCC 3.4.2和GCC 4.1.1仍然支持#pragma once,甚至沒有deprecation warning。VC6及其以后版本亦提供對#pragma once方式的支持。看來這一特性已經穩定下來了。
Feedback
#
re: #pragma once 與 #ifndef 解析(轉)
回復
更多評論
2013-03-18 11:30 by
augustheart
gcc已經會報告pragma once的警告了。說什么記不清了,因為自從看到它報后就改用單純的ifndef方式了,如今都過去一年多了。最開始我也是pragma和ifndef一起用,但是已經記不清為什么一起用了……
這轉的文章已經很老了,現在gcc都4.72了。
#
re: #pragma once 與 #ifndef 解析(轉)
回復
更多評論
2013-03-20 18:03 by
P
我想知道取消對#pragma once支持原因
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
相關文章:
#pragma once 與 #ifndef 解析(轉)
C++任意類型轉換模板
自己實現的memcpy()代碼
學習筆記--空類,虛函數類,虛繼承類的空間大小
學習筆記--const的作用
學習筆記--main函數結束后的調用
3種交換變量值的方法
自己實現的strcpy()和strlen()代碼
自己實現的atof()和atoi()代碼
學習筆記--extern關鍵字
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © C小加
日歷
<
2012年3月
>
日
一
二
三
四
五
六
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
公告
ACM小菜奮斗史 QQ:45716108 歡迎交友!
留言簿
(21)
給我留言
查看公開留言
查看私人留言
隨筆分類
(143)
C++和面向對象(17)
cocos2dx
JavaScript(1)
Linux(3)
NoSQL(3)
VC++(2)
操作系統(1)
解題報告(83)
模板(5)
設計模式(2)
數據結構和算法(12)
隨想人生(7)
網絡編程(7)
隨筆檔案
(145)
2013年7月 (1)
2013年5月 (1)
2013年4月 (2)
2013年3月 (4)
2012年12月 (3)
2012年11月 (1)
2012年9月 (5)
2012年8月 (6)
2012年7月 (1)
2012年6月 (1)
2012年5月 (8)
2012年4月 (6)
2012年3月 (25)
2012年2月 (11)
2012年1月 (12)
2011年12月 (10)
2011年11月 (46)
2011年9月 (1)
2011年4月 (1)
相冊
me
各大OJ入口
HDU
POJ
Ural
南陽理工學院(NYOJ)
近期比賽
近期比賽
信息網站
51CTO
ACM/ICPC信息站
CSDN論壇
GameRes
lkylky's blog
OGRE3D
OGRE大牛的bolg
UML軟件工程組織
開源社區
木牛
友情鏈接
陳玉's blog
侯颯颯's blog
開開甲's blog
小岳's blog
張云聰's blog
南陽理工學院ACM大牛,目前在百度工作
搜索
積分與排名
積分 - 486958
排名 - 41
最新評論
1.?re: 基本數據結構:鏈表(list)
評論內容較長,點擊標題查看
--sanshai
2.?re: 一步一步寫二叉查找樹[未登錄]
非常詳細 因為有清晰的實例描述一下就懂了 感謝博主
--Lu
3.?re: 一步一步寫二叉查找樹[未登錄]
刪除操作沒有考慮如果刪除的是根節點要怎么辦吧?
--Andy
4.?re: 關于拷貝(復制)構造函數為什么不能用值傳遞
值傳遞過程有返回值嗎
--奚大坤123
5.?re: 一步一步寫二叉查找樹
調用Deletepri(root,x);進行刪除之后,root指向被刪除那個位置的節點,而不是原樹的根節點?
--胡廣
閱讀排行榜
1.?基本數據結構:鏈表(list)(63201)
2.?一步一步寫平衡二叉樹(AVL樹)(42720)
3.?C++實現單例模式(17889)
4.?優秀博客推薦:各種數據結構與算法知識入門經典(不斷更新)(16199)
5.?poj 1005 I Think I Need a Houseboat 解題報告(15819)
評論排行榜
1.?一步一步寫平衡二叉樹(AVL樹)(23)
2.?C++實現單例模式(15)
3.?大三下學期計劃(15)
4.?標準C++的一些約定(9)
5.?優秀博客推薦:各種數據結構與算法知識入門經典(不斷更新)(9)
久久久久国产精品熟女影院
|
91性高湖久久久久
|
四虎影视久久久免费观看
|
日日狠狠久久偷偷色综合0
|
2021国内久久精品
|
91久久精品91久久性色
|
久久久久香蕉视频
|
人人狠狠综合久久88成人
|
国产日产久久高清欧美一区
|
欧美精品一区二区久久
|
久久久久免费精品国产
|
国产精品久久久久AV福利动漫
|
久久精品国产一区二区三区日韩
|
青青草国产97免久久费观看
|
久久精品国产亚洲AV麻豆网站
|
久久久噜噜噜久久
|
精品无码久久久久国产
|
99久久香蕉国产线看观香
|
国产成人99久久亚洲综合精品
|
久久精品中文字幕一区
|
国产亚洲色婷婷久久99精品91
|
人妻无码久久一区二区三区免费
|
亚洲国产成人久久综合碰碰动漫3d
|
久久国产精品波多野结衣AV
|
国内精品久久久久久99蜜桃
|
国产成人久久激情91
|
99精品久久精品
|
久久久久久久久久久久久久
|
久久婷婷五月综合成人D啪
|
99久久er这里只有精品18
|
国产A三级久久精品
|
一本大道久久香蕉成人网
|
91精品国产综合久久香蕉
|
国产精品久久影院
|
精品永久久福利一区二区
|
97久久精品无码一区二区
|
精品少妇人妻av无码久久
|
久久久久久午夜成人影院
|
久久亚洲AV成人无码国产
|
中文字幕久久波多野结衣av
|
亚洲国产另类久久久精品
|