我正在尝试在宏中生成包含文件名。这在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
但它不包含该文件。
有什么问题?我怎么能摆脱它?
答案 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)
请注意,这会遇到与@Andrew的答案相同的问题(前导下划线=保留标识符)。
答案 2 :(得分:3)
问题是最终你的代码看起来像这样:
#include "module""_impl_win.hpp"
这会产生相同的警告和错误,但会以稍微明显的方式显示。
虽然编译器会接受该语法,但预处理器不会。
我没有建议你做什么工作。个人不希望使用那种类型的宏,因为它使得在视觉上导航代码变得更加困难,并且可能会阻止许多编辑者快速导航代码。