2013-02-15 25 views
1

1.I看到很多地方,頭警衛和編譯一次使用起來太在一個特定的順序(沒有順序居然有關係嗎?)頭警衛和編譯一次

2.Also另一個疑問是默認每當VS IDE生成一個新的類文件時,它就會將#pragma放到實現文件(.cpp)中一次。這真的需要嗎?

#ifndef MYHEADER_H 
#define MYHEADER_H 

#pragma once 

//my set of includes 

這是正確的標題守衛或阻止多個包含物的方式嗎?

+0

爲了獲得它的好處,如果還有任何(@jalf),我想你必須先擁有它。 – ChiefTwoPencils 2013-02-15 21:38:20

+0

另請參見[爲什麼C/C++的「#pragma once」是ISO標準?](http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-標準?rq = 1) – 2013-02-15 21:43:26

回答

2
#pragma once 

儘管得到了許多流行的編譯器/預處理器的支持,但它並不是標準的。請參閱Is #pragma once a safe include guard?

#ifndef MYHEADER_H 
#define MYHEADER_H 
#endif // ndef MYHEADER_H 

保證可以與所有C++編譯器/預處理器一起使用。

沒有必要同時使用兩者。

0

「#pragma once」是編譯器特有的,可能不是可移植的。 「#ifndef/#define/#endif」更具可移植性,適用於所有預處理器。

+0

那麼這是否意味着添加兩者的好習慣?我不能說明爲什麼兩個都用在代碼中?如果還看到#pragma或者編譯器優化會消除#define,它是否會給出任何額外的編譯優化? – surega 2013-02-15 21:35:25

+0

我做了#pragma一次,幷包括警衛。我從來沒有比較過#pragma與包括守衛的表現,但我可以想象,在#pragma之後中止解析比尋找#endif更快。 – 2013-02-18 18:27:26

0

#pragma once與包括衛兵是一樣的,但它不是標準。它做同樣的事情,一些編譯器將編譯包含此指令的更快的文件。

它將被不支持它的編譯器忽略。

因此,既可以確保代碼的可移植性,又可以更快地編譯。

+2

不完全正確。舊版本的MSVC可以用'#pragma once'編譯得更快。較新版本對標頭警衛應用與編譯指示相同的優化。 (至少只要標題守衛包含文件中的所有內容,如果你的頭部守衛之外有代碼(你不應該擁有這些代碼),我相信它會禁用這個優化,然後編譯將會更快 – jalf 2013-02-15 21:36:34

+0

好吧,但爲什麼它在實現文件(這是IDE新的類模板)? – surega 2013-02-15 21:37:11

+0

@jalf我不知道這一點,我認爲它是在最新版本如果MSVC是相同的,那麼我會編輯我的帖子。 – JBL 2013-02-15 21:39:26