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

我想定义一个包含另一个头文件的宏,如下所示:

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

因此,当预处理器解析文件person.h时,MY_MACRO(blahblah)扩展为

#include“person.h.inline.inl”

关于如何做到这一点的任何提示?

除非您运行预处理器两次,否则无法使用#define构造其他预处理程序指令。

但是在你的情况下,即使运行预处理器两次也无济于事,因为#include必须是"..."<...>forms的单个字符串。

您不能使用__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  #define MY_MKDIR(x,y) _mkdir((x)) #else /*Linux*/ #define MKDIR_ENABLER  #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上有所不同)并为它引入了一个很好的包装器。