簡體   English   中英

我可以/應該在#ifndef之后輸入想要輸入的內容嗎?

[英]Can/should I type whatever I want after #ifndef?

例:

#ifndef HEADER_h
#define HEADER_h

#endif

除了HEADER_h ,我可以執行以下操作嗎?

#ifndef HEADER

要么

#ifndef LIBRARY

要么

#ifndef SOMETHING

要么

#ifndef ANOTHERTHING

等等

標頭防護只是利用預處理程序條件的一種約定,是一個“技巧”。 在使用標題保護程序時,您將創建一個具有名稱的宏,並檢查該宏是否已定義。

將該宏綁定到標頭的文件名沒有什么神奇的,因此您可以隨意調用它( 在合理范圍內 )。

但這並不意味着您應該編寫#ifndef URGLEBURGLE 您希望名稱有用唯一 ,否則沒有太多意義。

通常, #ifndef [PROJECTNAME]_[FILENAME]_INCLUDED是個好主意。

是的,您可以根據需要命名包含保護符號,但是請記住,它們在標頭中應該是唯一的。 你絕對不想要標題

// first.h
#ifndef NON_UNIQUE_H
#define NON_UNIQUE_H

void foo();

#endif

還有一個

// second.h
#ifndef NON_UNIQUE_H
#define NON_UNIQUE_H

void bar();

#endif

當您將兩者都包含在一個翻譯單元中時,一個將“獲勝”,並且其聲明將可見,例如

// main.cpp

#include "first.h" // now, NON_UNIQUE_H is defined
#include "second.h" // NON_UNIQUE_H already there, doesn't do anything

int main(int, char**)
{
    bar(); // error, won't compile, bar() isn't declared
}

除了必要的規避這樣的情況下,最好堅持在整個項目的一些慣例。 一種經典的實現方法是將頭文件的基本名稱轉換為大寫並附加_H 如果在不同目錄中具有具有相同基本名稱的頭文件,則可以包含目錄名稱,例如SUBDIR_FOO_HOTHERSUBDIR_FOO_H 但這取決於您。

您可以使用類似

#if !defined(HEADER) || !defined(LIBRARY)

在您的問題上,您正在使用

#ifndef HEADER_h
#define HEADER_h

#endif

它與“ #pragma一旦”相同,是的,您可以使用不同的define名稱。 在您的情況下, LIBRARYSOMETHINGHEADER_h-定義可以在代碼(#define MY_VAR_NAME)或通過編譯器選項(標志-DMY_VAR_NAME)中進行設置。

您的示例是所謂的標題保護,使我們能夠確保僅將標題的內容包含一次。 但是,這不是#ifndef的唯一用法。您可以使用#ifndef進行條件編譯,如下所示

 #ifndef NO_DEBUG
 do_some_debug_stuff();
 #endif

因此,它不僅用於標題保護,而且通常必須仔細選擇要引入的符號的名稱,以防止它們與其他地方定義的符號沖突。 只是標題保護非常普遍,以至於存在某些約定(例如,使用FOLDER_FILENAME_H通常足以確保唯一性)。 您需要知道某些名稱是保留的(例如,以兩個下划線開頭或下划線后跟大寫字母)。

暫無
暫無

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

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