簡體   English   中英

#include宏__FILE__派生的文件?

[英]#include file derived from macro __FILE__?

觀察以下程序:

#include __FILE__
main(){}

預處理器陷入無限遞歸中,其中包括自身內部的副本,並抱怨main()已被定義。


如果可以使用宏包含文件,是否可以基於__FILE__導出文件名並將其包含?


例如,我想在"foo.cpp"包含"foo.h" "foo.cpp" ,但要從__FILE__派生它。

可以用預處理器完成嗎?

C標准指定#include三種形式:

#include <file>
#include "file"
#include ANYTHING ELSE

在前兩種情況下,沒有宏擴展發生,因此無法改變行為。 在第三種情況下,C99說(§6.10.2p4):

指令中#include之后的預處理標記為[宏擴展]。 所有替換后產生的指令應與先前兩種形式之一匹配[腳注:請注意,相鄰的字符串文字不會被連接成單個字符串文字]。 實現定義了將<和>預處理令牌對之間的一系列預處理令牌或一對“字符”組合為單個標頭名稱預處理令牌的方法。

在C ++ 98§16.2p4中出現了略有不同但實際上等效的措詞。

任何帶有“ shall”的句子都會有一個嚴格的要求:在這種情況下,如果ANYTHING ELSE擴展為ANYTHING ELSE <開頭,以>開頭或以"開頭的標記序列之外的任何東西,則該程序是不正確的。令牌序列的確切解釋是由實現定義的,但是請注意,腳注特別禁止字符串-文字級聯。

因此,由於__FILE__的擴展名是字符串常量,因此在#include中使用它的唯一方法是

#include __FILE__

正如您所發現的,這導致無限遞歸,並且

#define LT <
#define GT >
#include LT __FILE__ etc GT

它對我可以方便地測試的所有編譯器產生了有趣但無用的影響。 假設以上內容位於名為test.c的文件中:

  • GCC試圖打開一個名為"test.c" etc的文件,並用引號和空格逐字包含。
  • clang甚至是文字,它查找相同的文件名,但帶有前導和尾隨空格。
  • MSVC 宏擴展LT (據我認為這是違反一致性),抱怨沒有匹配項> ,然后嘗試打開名為__FILE__ etc GT的文件。

此處記錄了GCC的行為 ;您有其他任何事情要靠自己承擔。)

tl; dr:無法從預處理器內部執行所需的操作。 我建議確定構建系統中要包含的文件的名稱,並使用-D開關將其通知編譯器(在Unixy系統上,您需要雙引號-DINCLUDEME='"includeme.h"' ;我不會說CMD)

我想出的最好的方法是:

#define foo(x) #x
#include foo(x)

prog.cpp:2:16:錯誤:x:沒有這樣的文件或目錄

暫無
暫無

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

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