簡體   English   中英

使用#define在C ++ / C中包含另一個文件

[英]Using #define to include another file in C++/C

我想定義一個包含另一個頭文件的宏,如下所示:

#define MY_MACRO (text) #include "__FILE__##_inline.inl"

因此,當預處理程序解析文件person.h時,MY_MACRO(blahblah)擴展為

#include“ person.h.inline.inl”

有關如何執行此操作的任何提示?

除非您兩次運行預處理程序,否則無法使用#define構造其他預處理程序指令。

但是在您的情況下,即使兩次運行預處理程序也無濟於事,因為#include必須是形式為"..."<...>的單個字符串。

您不能使用__FILE__因為它已經被引用了,並且#include不支持字符串連接。 但是您可以在#include之后使用宏:

#define STRINGIZE_AUX(a) #a
#define STRINGIZE(a) STRINGIZE_AUX(a)
#define CAT_AUX(a, b) a##b
#define CAT(a, b) CAT_AUX(a, b)
#define MY_MACRO(file, name) STRINGIZE(CAT(file, CAT(name, _inline.inl)))
#include MY_MACRO(aaaa, qqq)

您應該使用等效的Boost.Preprocessor宏而不是CATSTRINGIZE來防止全局名稱空間污染。

您不能使用預處理器編寫其他預處理器指令。 但是,我相信您可以僅定義文件名:

#define MY_MACRO(name) "__FILE__##name_inline.inl"

#include MY_MACRO(name)

預處理程序將運行多次,直到無法進行進一步的替換為止,因此它應首先擴展名稱,然后#include引用的文件。

編輯:我只是嘗試過,預處理器不能處理這樣的報價。

#define MY_MACRO(x) <__FILE__##x_inline.inl>
#include MY_MACRO(foo)

可以,但是<>可能不是您想要的。

EDIT2:正如某人在評論中指出的那樣, __FILE__無法正確展開,這畢竟可能不是您想要的。 抱歉。

#if 0 /*Windows*/
#define MKDIR_ENABLER <direct.h>
#define MY_MKDIR(x,y) _mkdir((x))
#else /*Linux*/
#define MKDIR_ENABLER <sys/stat.h>
#define MY_MKDIR(x,y) mkdir((x),(y))
#endif

#include MKDIR_ENABLER

int main(void)
{
    MY_MKDIR("more_bla",0644);
    return 0;
}

該代碼包括適用於mkdir的頭文件(因為它在UNIX和Windows上有所不同),並為此引入了一個不錯的包裝器。

暫無
暫無

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

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