[英]#include file derived from macro __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
的文件中:
"test.c" etc
的文件,並用引號和空格逐字包含。 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.