在宏中生成包含文件名

led*_*kol 20 c++ macros include

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

#define INCLUDE_FILE "module_impl_win.hpp"
#include INCLUDE_FILE
Run Code Online (Sandbox Code Playgroud)

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

#define INCLUDE_FILE(M) M##"_impl_win.hpp"
#include INCLUDE_FILE("module")
Run Code Online (Sandbox Code Playgroud)

实际上它给了我MSVC2010的警告

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

但它不包括该文件.

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

小智 19

我是用助手引用宏来做的.这样的东西会给你你想要的东西:

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

#include INCLUDE_FILE(module)
Run Code Online (Sandbox Code Playgroud)

  • 你必须小心这种方法.`_impl_win`是一个标识符标记,因为它以下划线开头(并且在宏命名空间中),它保留给实现.你应该中断领先的`_`并将其单独连接,虽然我不知道如何做到这一点,因为`_`本身是一个保留的标识符. (2认同)
  • BTW,它有多便携? (2认同)
  • 一方面,诸如`QUOTEME(M##.hpp)` 或`QUOTEME(M##/impl.hpp)` 之类的东西不起作用。 (2认同)