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)
亚洲精品tv久久久久久久久久
|
亚洲国产精品综合久久网络
|
亚洲AV无码久久精品成人
|
国产免费久久精品99re丫y
|
99精品国产综合久久久久五月天
|
无码伊人66久久大杳蕉网站谷歌
|
色妞色综合久久夜夜
|
一本一本久久aa综合精品
|
国产精品久久久久9999
|
久久久久亚洲AV无码去区首
|
亚洲国产精品高清久久久
|
国产激情久久久久影院
|
久久精品国产亚洲AV电影
|
久久精品成人
|
国产产无码乱码精品久久鸭
|
伊人精品久久久久7777
|
亚洲天堂久久精品
|
成人久久免费网站
|
久久久久无码中
|
99精品伊人久久久大香线蕉
|
亚洲精品tv久久久久久久久
|
久久精品国产精品亚洲下载
|
久久久精品一区二区三区
|
久久无码AV一区二区三区
|
精品无码久久久久久久久久
|
久久99久久99精品免视看动漫
|
久久国产AVJUST麻豆
|
久久男人中文字幕资源站
|
国产精品激情综合久久
|
WWW婷婷AV久久久影片
|
精品人妻久久久久久888
|
7777精品久久久大香线蕉
|
精品久久亚洲中文无码
|
久久精品国产亚洲av瑜伽
|
91精品国产综合久久四虎久久无码一级
|
久久天天躁狠狠躁夜夜不卡
|
久久精品www
|
久久99亚洲综合精品首页
|
国产精品青草久久久久福利99
|
国产99久久久国产精品~~牛
|
99久久中文字幕
|