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年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
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
1
2
3
4
5
6
公告
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大牛,目前在百度工作
搜索
積分與排名
積分 - 486891
排名 - 41
最新評論
1.?re: 基本數據結構:鏈表(list)
評論內容較長,點擊標題查看
--sanshai
2.?re: 一步一步寫二叉查找樹[未登錄]
非常詳細 因為有清晰的實例描述一下就懂了 感謝博主
--Lu
3.?re: 一步一步寫二叉查找樹[未登錄]
刪除操作沒有考慮如果刪除的是根節點要怎么辦吧?
--Andy
4.?re: 關于拷貝(復制)構造函數為什么不能用值傳遞
值傳遞過程有返回值嗎
--奚大坤123
5.?re: 一步一步寫二叉查找樹
調用Deletepri(root,x);進行刪除之后,root指向被刪除那個位置的節點,而不是原樹的根節點?
--胡廣
閱讀排行榜
1.?基本數據結構:鏈表(list)(63200)
2.?一步一步寫平衡二叉樹(AVL樹)(42720)
3.?C++實現單例模式(17888)
4.?優秀博客推薦:各種數據結構與算法知識入門經典(不斷更新)(16197)
5.?poj 1005 I Think I Need a Houseboat 解題報告(15819)
評論排行榜
1.?一步一步寫平衡二叉樹(AVL樹)(23)
2.?C++實現單例模式(15)
3.?大三下學期計劃(15)
4.?標準C++的一些約定(9)
5.?優秀博客推薦:各種數據結構與算法知識入門經典(不斷更新)(9)
久久久久人妻精品一区三寸蜜桃
|
久久久久人妻一区二区三区vr
|
亚洲国产精品无码久久一区二区
|
亚洲国产二区三区久久
|
东方aⅴ免费观看久久av
|
狠狠色丁香久久婷婷综合蜜芽五月
|
大伊人青草狠狠久久
|
97精品久久天干天天天按摩
|
久久国产精品无码一区二区三区
|
久久婷婷国产剧情内射白浆
|
久久久这里有精品中文字幕
|
国产精品成人久久久
|
久久99国产乱子伦精品免费
|
欧美久久综合性欧美
|
国产69精品久久久久9999
|
久久精品二区
|
久久久这里有精品
|
色88久久久久高潮综合影院
|
99久久无码一区人妻a黑
|
久久国产成人午夜aⅴ影院
|
久久久久精品国产亚洲AV无码
|
久久天天躁夜夜躁狠狠
|
久久精品国产第一区二区三区
|
精品人妻久久久久久888
|
91精品日韩人妻无码久久不卡
|
精品久久久久国产免费
|
久久国产高潮流白浆免费观看
|
97久久精品无码一区二区
|
久久精品国产精品亚洲艾草网美妙
|
亚洲AⅤ优女AV综合久久久
|
日韩精品久久无码人妻中文字幕
|
久久91亚洲人成电影网站
|
一级A毛片免费观看久久精品
|
国内精品人妻无码久久久影院
|
国产精品免费久久久久久久久
|
午夜精品久久久久成人
|
久久99精品国产麻豆宅宅
|
亚洲精品无码久久久久AV麻豆
|
久久久久久久久久久久中文字幕
|
久久露脸国产精品
|
99久久中文字幕
|