簡體   English   中英

是否具有C ++標准庫ifdef或ifndef預處理程序指令?

[英]Have C++ standard library ifdef or ifndef preprocessor instructions?

我正在用C ++構建自己的終端應用程序項目,並問自己標准庫是否包含ifdef或ifndef預處理程序指令。 我想知道,因為我需要創建不同的頭文件,而這些頭文件需要一些標准的庫頭文件(例如“ string”)和其他一些文件頭,因此我不想包含3次或多次相同的庫文件,因為這會使程序變重。
例如,我在頭文件中寫了類似這樣的內容,以防止.h文件被多次包含:

#ifndef myheader_h
#define myheader_h
    // my file code here
#endif

我嘗試編譯,但是編譯器對錯誤或警告一無所知。
我還嘗試閱讀標准庫源代碼( https://en.cppreference.com/w/cpp/header ),但沒有找到任何類似於ifdef或ifndef的預處理器規則。
我應該包括這樣的標准庫頭嗎?

#ifndef string_h
#define string_h
    #include <string>
#endif

我希望我的問題沒有被問到,因為我在搜索時沒有找到它。

更新

and who said , I meant: program's heaviness is important, I want to make it slighter so I don't want to entirely include the same file multiple times. 對於一些說並且說 ,我的意思是:程序的繁重很重要,我想使其更輕一點我不想多次包含同一文件。 標准lib文件有適當的包括防護措施嗎? (我的頭文件有它們,不知道std lib文件)

不需要標准頭文件#define任何特定的預處理器符號以確保它們可以#include d次。

話雖如此,任何理智的實施方式都可以確保可以多次#include d而不會對應用程序代碼產生不利影響。

事實證明,這是大多數標頭的標准要求(謝謝@ Rakete1111)。

C ++標准

翻譯單元可以按任何順序( [lex] )包含庫頭。 每個<cassert>都可以被包含一次以上,與僅包含一次就沒有什么不同,除了包含<cassert><assert.h>效果每次都取決於NDEBUG的詞法當前定義。

不僅如此,他們很有可能正在使用#pragma once指令。 因此,即使您對同一標頭多次使用#include ,它們也只會被讀取一次。

總之,不用擔心標准頭文件。 如果您的頭文件正確實現,那么您的應用程序就可以了。

我問自己[sic]標准庫是否包含ifdef或ifndef預處理程序指令

盡管確實要求以某種方式保護多重包含,但該標准未指定是否存在ifdef樣式的標頭保護。 我看了一下stdlibc ++標准庫實現的隨機標頭。 它確實有標頭防護。

我不想包含相同的庫3次或多次,因為它會使程序變重

多次包含頭文件不會使程序“變重”。

我應該包括這樣的標准庫頭嗎?

 #ifndef string_h #define string_h #include <string> #endif 

那不是必需的,或者是特別有用的。

您正在談論的那些預處理器指令稱為“頭保護器”,標准庫頭肯定具有它們(或其他執行相同功能的機制),就像所有其他適當的頭文件一樣。 多次包含它們不會造成任何問題,並且在編寫自己的頭文件時只需擔心這些問題。

您正在閱讀的“源代碼”只是說明頭文件應如何工作的文檔,但未提供實際的代碼。 要查看代碼,可以查看編譯器提供的頭文件。 例如,Visual Studio中的<iostream>標頭同時具有#pragma once和標頭防護:

#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
//...
#endif /* _IOSTREAM_ */

GCC編譯器提供的標頭還具有標頭防護:

#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1
//...
#endif /* _GLIBCXX_IOSTREAM */

暫無
暫無

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

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