[英]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 或類型的名稱完全相同的方式:
首先,請查閱語言規則,了解為語言實現保留哪些標識符,不要使用任何這些標識符。
#ifndef _HeaderFile_
這是保留標識符的示例。 除非您正在實現標准庫,否則不要定義它。
接下來,排除在程序中用於任何其他目的的任何標識符。 如果您有名為x
的變量,則不要將其用作 header 保護。 如果您有一個名為y
的 header 防護裝置,則不要將其用作另一個 header 防護裝置。 如果您有一個名為XYZ_H
的 function ,則不要將其用作 header 防護裝置。
現在,從其余名稱中選擇任何標識符。 應該有很多可供選擇的。
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.