我想定义一个包含另一个头文件的宏,如下所示:
#define MY_MACRO (text) #include "__FILE__##_inline.inl"
因此,当预处理器解析文件person.h时,MY_MACRO(blahblah)扩展为
#include“person.h.inline.inl”
有关如何执行此操作的任何提示?
答案 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上有所不同)并为其引入了一个不错的包装器。