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

时间:2010-07-05 11:02:02

标签: c++ c

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

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

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

#include“person.h.inline.inl”

有关如何执行此操作的任何提示?

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:10)

您无法使用__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) 之后使用宏:

CAT

您应该使用等效的Boost.Preprocessor宏而不是STRINGIZE和{{1}}来防止全局命名空间污染。

答案 2 :(得分:3)

您无法使用预处理器编写其他预处理器指令。但是,我相信你只能定义文件名:

#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)

工作正常,但&lt;&gt;可能不是你想要的。

EDIT2:正如评论中所指出的那样,__FILE__没有正确扩展,这使得这可能不是你想要的。遗憾。

答案 3 :(得分:-5)

#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上有所不同)并为其引入了一个不错的包装器。