簡體   English   中英

#include預處理器宏名稱空間

[英]#include preprocessor macro name space

這個問題是為了理解頭文件包含的標准行為(而不是在我的編譯器上實現的行為)。

我有兩個名稱相同的頭文件(但內容不同):

1) /user/include/myheader.h  # In standard system folder
2) /private/myheader.h       # In my private folder

假設兩個標頭都包含相同的多個包含預防宏

#ifndef MYHEADER
#define MYHEADER
...
#endif

我有C文件/private/test.c ,其中包括上述兩個標頭:

#include <myheader.h>  // Includes from standard system folder
#include "myheader.h"  // Includes from the folder where test.c is present

由於每個MYHEADER定義都有單獨的名稱空間,因此在預處理時,兩個文件中的內容是否都進入C文件中? 還是因為在同一名稱空間中已經定義了MYHEADER,所以將防止第二個包含?

所有宏只有一個名稱空間,所有宏都位於同一個名稱空間中。 將內容放入不同的頭文件中對此沒有影響-它們都仍位於相同的名稱空間中。 因此,在您的示例中,第一個標頭將定義MYHEADER ,這將導致(有效)忽略第二個標頭。

N1570

6.10.3宏替換

...
7緊隨define之后的標識符稱為宏名稱 宏名稱只有一個名稱空間。 對於任何一種形式的宏,預處理令牌替換列表之前或之后的任何空格字符均不視為替換列表的一部分。

強調我的。

按照書面規定,僅第一個myheader.h文件的內容將被處理。

C標准1中沒有用於預處理程序定義的“名稱空間”之類的東西。 MYHEADER定義MYHEADER 2 ,第二個文件的內容都將被忽略。


1 C99標准的第6.2.3節定義了四個名稱空間-(1)用於標簽,(2)用於struct / union / enum標簽,(3)用於每個結構或聯合的成員,以及(4)其他所有內容。 預處理程序定義不屬於任何這些名稱空間,因為“此處不再考慮宏名稱和宏參數,因為在程序翻譯的語義階段之前,源文件中所有出現的宏名稱都將被預處理令牌序列替換。構成它們的宏定義。”。

2就定義MYHEADER而言,您有幾個選擇:您可以在C文件,頭文件中定義它,或使用C編譯器的相應選項從命令行傳遞它。

因為#define指令具有全局作用域,所以僅使用一個定義,因此第二個include將不起作用。

您應該使用MY_PROJECT_MY_HEADER或類似的東西,以防止發生此類問題。

暫無
暫無

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

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