有如果SOME_HEADER_H
已經定義被包括在報頭的前面,然後,在第二情況下,預處理器將處理#pragma once
在一個微妙的差異,並且在第一它不會。
你會用同樣的TU再次看到一個功能上的差異,如果你#undef SOME_HEADER_H
,包括文件:現在
#define SOME_HEADER_H
#include "some_header.h"
#undef SOME_HEADER_H
#include "some_header.h"
,如果1我有頭文件中的所有定義。在情況2中,我沒有。
即使沒有#undef
,由於在情況1中忽略了#pragma once
,您可以想象會看到預處理時間的差異。這取決於實施。
我能想到的它可能已經是第一個包含這個頭文件之前定義兩種可能的方式:
- (明顯的一個),一個完全獨立的文件定義它,無論是故意或意外名稱衝突,
- 該文件的副本已經定義了它。取決於可能包括這種文件在兩個不同文件名下涉及相同TU的情況的實施方式,例如,由於符號鏈接或文件系統合併。如果你的實現支持
#pragma once
,並且你仔細檢查它的文檔,你可能能夠找到一個明確的聲明,說明優化是通過包含文件的路徑來應用的,還是通過比較標識文件存儲的東西inode號碼。如果是後者,你甚至可以找出是否仍然存在詐騙行爲,可能被拉扯欺騙預處理,如遠程安裝一個本地文件系統,以掩蓋它的「同一個文件真正」 ...
用於以預期的方式,但是,沒有提供的實施,微軟定義的方式對待#pragma once
差異。只要它被處理而不是被跳過,它就會標記包含文件以進行優化,所以無論它是否會在文件中進行第二遍處理都無關緊要 - 第二遍不會發生。
,因爲編譯是非標準的,至少在理論上它可以有不同的實現方式完全不同的含義,在這種情況下,當多少次對其進行處理,可能無關緊要,當然還有。在實踐中,你會認爲沒有人會這樣做。
將兩者都包含在內是相當多餘的,你不覺得嗎?我只是使用這些定義來檢查。的 – 2011-03-21 19:15:27
可能重複[曾經的#pragma VS包括警衛?](http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards) – Jon 2011-03-21 19:27:39
@Tim:他們是在編譯器非冗餘那識別一次「編譯指示」,但不執行gcc所做的巧妙優化,以便在標題保護允許它不會再次訪問文件時識別。至少某些版本的MSVC處於該狀態,不知道最新的。 – 2011-03-21 19:32:46