1.#pragmaonce這個巨集有什麼作用?
為了避免同乙個標頭檔案被包含(include)多次,c/c++中有兩種巨集實現方式:一種是#ifndef方式;另一種是#pragma once方式。
在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別。但兩者仍然有一些細微的區別。
2.兩者的使用方式有何區別?
示例**如下:
複製**
//方式一:
#ifndefsomefile_h
#definesomefile_h
… … // 宣告、定義語句
#endif
//方式二:
#pragmaonce
… … // 宣告、定義語句
複製**
3.兩者各有何特點?
(1)#ifndef
#ifndef的方式受c/c++語言標準支援。它不僅可以保證同乙個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者**片段)不會被不小心同時包含。
當然,缺點就是如果不同標頭檔案中的巨集名不小心「撞車」,可能就會導致你看到標頭檔案明明存在,但編譯器卻硬說找不到宣告的狀況——這種情況有時非常讓人鬱悶。
由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,因此在編譯大型專案時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支援#pragma once的方式。
(2)#pragma once
#pragma once 一般由編譯器提供保證:同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。
你無法對乙個標頭檔案中的一段**作pragma once宣告,而只能針對檔案。
其好處是,你不必再擔心巨集名衝突了,當然也就不會出現巨集名衝突引發的奇怪問題。大型專案的編譯速度也因此提高了一些。
對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名衝突引發的「找不到宣告」的問題,這種重複包含很容易被發現並修正。
另外,這種方式不支援跨平台!
4.兩者之間有什麼聯絡?
#pragma once 方式產生於#ifndef之後,因此很多人可能甚至沒有聽說過。目前看來#ifndef更受到推崇。因為#ifndef受c/c++語言標準的支援,不受編譯器的任何限制;
而#pragma once方式卻不受一些較老版本的編譯器支援,一些支援了的編譯器又打算去掉它,所以它的相容性可能不夠好。
一般而言,當程式設計師聽到這樣的話,都會選擇#ifndef方式,為了努力使得自己的**「存活」時間更久,通常寧願降低一些編譯效能,這是程式設計師的個性,當然這是題外話啦。
還看到一種用法是把兩者放在一起的:
#pragma once
#ifndefsomefile_h
#definesomefile_h
… … // 宣告、定義語句
#endif
總結:
看起來似乎是想兼有兩者的優點。不過只要使用了#ifndef就會有巨集名衝突的危險,也無法避免不支援#pragma once的編譯器報錯,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑。
選擇哪種方式,應該在了解兩種方式的情況下,視具體情況而定。只要有乙個合理的約定來避開缺點,我認為哪種方式都是可以接受的。而這個已經不是標準或者編譯器的責任了,應當由程式設計師自己或者小範圍內的開發規範來搞定。
為了避免同乙個檔案被include多次
1 #ifndef方式
2 #pragma once方式
在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __somefile_h__
#define __somefile_h__
... ... // 一些宣告語句
#endif
方式二:
#pragma once
... ... // 一些宣告語句
#ifndef的方式依賴於巨集名字不能衝突,這不光可以保證同乙個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。當然,缺點就是如果不同標頭檔案的巨集名不小心「撞車」,可能就會導致標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況
#pragma once則由編譯器提供保證:同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。帶來的好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名碰撞引發的「找不到宣告」的問題,重複包含更容易被發現並修正。
方式一由語言支援所以移植性好,方式二 可以避免名字衝突 static用法總結
static static關鍵字是c,c 中都存在的關鍵字,它主要有三種使用方式,其中前兩種只指在c語言中使用,第三種在c 中使用 c,c 中具體細微操作不盡相同,本文以c 為準 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 下面就這三種使用方式及注意事項分別說明 一 區域...
sizeof用法總結
在vc中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof後面的 引數對sizeof的用法做個總結。a 引數為資料型別或者為一般變數。例如sizeof int sizeof long 等等。這種情 況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int型別在...
sizeof 用法總結
sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示 2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的一種。所有指標變數的siz...