在宏中生成包含文件名

时间:2011-01-20 05:41:25

标签: c++ macros include

我正在尝试在宏中生成包含文件名。这在C ++中应该是合法的:

#define INCLUDE_FILE "module_impl_win.hpp"
#include INCLUDE_FILE

这样可以正常工作,但是一旦我尝试生成文件名就很难编译

#define INCLUDE_FILE(M) M##"_impl_win.hpp"
#include INCLUDE_FILE("module")

实际上它在MSVC2010上给了我警告

  

警告C4067:预处理器指令后面的意外标记 - 期望一个newlin

但它不包含该文件。

有什么问题?我怎么能摆脱它?

3 个答案:

答案 0 :(得分:19)

我是使用助手引用宏来做到这一点的。这样的东西会给你你想要的东西:

#define QUOTEME(M)       #M
#define INCLUDE_FILE(M)  QUOTEME(M##_impl_win.hpp)

#include INCLUDE_FILE(module)

答案 1 :(得分:4)

您还可以使用Boost预处理器,尤其是BOOST_PP_STRINGIZE / BOOST_PP_CAT宏:

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>

#define INCLUDE_FILE(M) BOOST_PP_STRINGIZE(BOOST_PP_CAT(M, _impl_win.hpp))

// expands to: #include "module_impl_win.hpp"
#include INCLUDE_FILE(module)

(参见C Macro - Dynamic #include

请注意,这会遇到与@An​​drew的答案相同的问题(前导下划线=保留标识符)。

答案 2 :(得分:3)

问题是最终你的代码看起来像这样:

#include "module""_impl_win.hpp"

这会产生相同的警告和错误,但会以稍微明显的方式显示。

虽然编译器会接受该语法,但预处理器不会。

我没有建议你做什么工作。个人不希望使用那种类型的宏,因为它使得在视觉上导航代码变得更加困难,并且可能会阻止许多编辑者快速导航代码。