簡體   English   中英

多余包含必要的警衛?

[英]Are redundant include guards necessary?

Codegear RAD Studio 2009中是否需要“冗余包括警衛”? 編譯器是否足夠聰明,可以自行處理?

例如,我可能在foo.h中有以下'include guard':

#ifndef fooH
#define fooH
// ... declaration here
#endif

以及use_foo.h中的以下'冗余包含保護':

#ifndef fooH
    #include "foo.h"
#endif

此外,如果編譯器不夠智能,如果它們包含在源文件中,那么“冗余包括警衛”是必需的。 例如use_foo.cpp

您標記為“冗余包含保護”的代碼部分不是必需的,但它是可能的優化。

在C ++ Builder的情況下,有檢測標題保護的邏輯,因此它不是必需的。

在一般情況下,無論如何,預處理過程通常非常快,因此無論如何這種優化都不太可能給你帶來太大的影響。

這些冗余包括防護旨在模擬建議的#pragma once指令的功能:如果已經包含了一些頭文件,那么預處理器甚至不會再嘗試查找,打開和解析它(因為它必須與“普通”包括警衛技術)。 在許多情況下,這使得包含文件的處理更加有效(加快編譯速度)。

這種方法顯然是一種高維護的方法:必須確保保護符號的拼寫在頭文件內部以及外部完全相同。

正如你所說的那樣,“冗余包括警衛”加速了編譯。

如果沒有冗余保護,編譯器將迭代整個foo.h文件,查找可能在#ifndef塊之外的一些代碼。 如果它是一個長文件,並且這很多地方,編譯器可能會浪費很多時間。 但是使用冗余防護,它可以跳過整個#include語句,甚至不會重新打開該文件。

當然,你必須進行實驗,看看編譯器在foo.h中迭代而不是實際編譯任何內容所浪費的實際時間。 也許現代編譯器實際上會尋找這種模式,並且自動知道根本不打算打開文件,我不知道。

(開始編輯280Z28)

以下標題結構至少被 GCC和MSVC識別。 使用這種模式幾乎可以抵消包含文件中的警衛所帶來的所有好處。 請注意,編譯器檢查結構時將忽略注釋。

// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED

// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#   pragma once
#endif

// header text goes here.

#endif

(結束編輯)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM