簡體   English   中英

確定#include的標准頭文件

[英]Deciding which standard header files to #include

假設我正在編輯一些大型C ++源文件,並添加了幾行恰好使用auto_ptr的代碼,如下例所示。

#include <string>

// ... (much code here)

void do_stuff()
{
    std::string str("hello world");
    // ... (much code here too)
    std::auto_ptr<int> dummy; // MY NEW CODE
    // ...
}

這個例子在gcc 3.4.4(cygwin)上編譯,因為標准頭文件<string>碰巧包含了編譯auto_ptr所需的頭文件<memory> 但是,這不適用於gcc 4.5.0(mingw); 他們似乎已經清理了他們的頭文件或其他東西。

所以,當我添加使用auto_ptr代碼時,我應該立即查看文件是否在開頭包含#include <memory>這個答案意味着什么? 我從來沒有這樣做(我覺得太煩人了); 我總是依賴編譯器來檢查是否缺少#include

是否有任何選項不會破壞編碼,並確保我的代碼的可移植性?

是否有一個C ++標准庫實現,其標題不是必需的彼此包含?

如果在標准庫中使用某些內容,則應包括定義它的標頭。 這是唯一的便攜式選擇。 這樣你就可以避免你引用的實例,其中一個標題恰好包含在一個版本或編譯器中,而不是另一個。 auto_ptr<memory>定義,因此如果您使用它,請包含該標頭。

[編輯...]

回答你的評論......你是否在詢問編譯器是否可以幫助檢測何時使用標准頭文件中沒有直接包含的內容? 這會有所幫助,但我認為這有點太多了。 這將要求編譯器知道哪些標准庫頭包含哪些標准庫定義,然后檢查是否包含了所使用定義的正確庫頭。

確切地確定如何包含標題也是一項艱巨的任務。 如果您使用的是標准庫定義,則必須以某種方式包含標題。 編譯器必須告訴您是否自己包含標頭(可能通過您自己的標頭或第三方庫)或者是否通過另一個標准庫標頭。 (例如,在您的示例中,它必須能夠通過<string>或包含在您自己的代碼中來區分<memory>之間的區別。)

它必須處理標准庫的不同版本(例如C ++ 03 vs C ++ 0x)和不同的供應商。 如果那些第三方stdlib的供應商不完全遵循標准,那么你可能會收到關於要包含哪些標頭的錯誤警告。

我只是這樣說試圖解釋(用我有限的編譯器/ stdlib知識)為什么我不認為編譯器有這個功能。 我同意,這會有所幫助,但我認為成本超過了收益。

最好的方法是包含定義構造的正確頭。 和Include文件應該通過使用“保護”文件的宏來防止多重包含

通常頭文件包含它們的“包含警戒”。 警衛由以下人員組成:

MyHeader.h:

#ifndef __MY_HEADER_H__
#    define __MY_HEADER_H__

     //body of MyHeader.h

#endif

因此,您可以根據需要多次包含MyHeader.h:

#include "MyHeader.h"
#include "MyHeader.h"
#include "MyHeader.h"
#include "MyHeader.h"

並且它不會對編譯器造成任何問題(它只會被包含一次)。 此外,您可以包含另一個包含“MyHeader.h”的文件,並應用相同的規則。

這意味着,如果你想使用標題中定義的東西 - 包括它! (即使你認為其他東西可能包括它,也沒有理由不安全)。

暫無
暫無

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

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