[英]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)。
翻譯單元可以按任何順序( [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.