簡體   English   中英

如何在 C++ 的 header 文件中確定適當的條件包含標識符 (#ifndef)?

[英]How to determine the appropriate identifier of conditional inclusion (#ifndef) in header files for C++?

當我創建一個新的 HeaderFile.h 時,我使用的是 IDE 它給了我以下行

#ifndef CODE_HEADERFILE_H

但我也看到了以下用法:

#ifndef _HeaderFile_
#ifndef HEADERFILE_H

如果 header 文件被多次加載,label 是完全任意的嗎? 如果另一個不同的 header 文件具有相同的標識符並且兩者都包含在某個地方會發生什么?

包括守衛定義命名是個人的,但通常它的形式是

HEADER_FILE_NAME_H

但是你可以選擇任何你想要的名字,只要它不與其他包含保護沖突,否則只有 1 個文件最終會被包含。

還有#pragma once ,雖然標准不支持它,但所有主要編譯器都支持它。 這消除了一起包含防護的需要。

如何在 C++ 的 header 文件中確定適當的條件包含標識符 (#ifdef)?

與確定任何變量、宏、function 或類型的名稱完全相同的方式:

  1. 首先,請查閱語言規則,了解為語言實現保留哪些標識符,不要使用任何這些標識符。

     #ifndef _HeaderFile_

    這是保留標識符的示例。 除非您正在實現標准庫,否則不要定義它。

  2. 接下來,排除在程序中用於任何其他目的的任何標識符。 如果您有名為x的變量,則不要將其用作 header 保護。 如果您有一個名為y的 header 防護裝置,則不要將其用作另一個 header 防護裝置。 如果您有一個名為XYZ_H的 function ,則不要將其用作 header 防護裝置。

  3. 現在,從其余名稱中選擇任何標識符。 應該有很多可供選擇的。

label 是完全任意的

只有任何其他變量、宏、function 或類型名稱是任意的。 您只需要想出一個唯一的名稱。

但是,您無需在任何其他上下文中引用 header 保護宏,因此您無需擔心它與程序中的大多數其他名稱不同。

如果另一個不同的 header 文件具有相同的標識符並且兩者都包含在某個地方會發生什么?

定義 FOO 時ifndef FOO FOO發生什么? 預處理器將刪除指令之后的所有內容,直到下一個#endif指令(或#else ,但這在 header 防護裝置中很少見)。 這就是 header 防護如何防止多個包含在同一個文件中:預處理器指令將后續包含設為空。 如果多個標頭共享同一個保護,則第二個包含的標頭將為空。 這可能會是一個問題。

也許,這完全取決於您和您的公司或您的團隊的代碼風格。 當我寫#ifdef 或#ifndef 時,通常我會寫如下語句: 1) #ifndef HEADERFILE_H 2) #ifndef HEADER_FILE_H 3) #ifndef PATH_TO_YOUR_HEADERFILE_HEADERFILENAME_H

暫無
暫無

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

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