[英]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宏而不是CAT
和STRINGIZE
來防止全局名稱空間污染。
您不能使用預處理器編寫其他預處理器指令。 但是,我相信您可以僅定義文件名:
#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.