我可以在#include指令中使用预处理器变量吗?

yeg*_*256 4 c++

这就是我想要做的:

$ c++ -D GENERATED=build/generated-content main.cpp
Run Code Online (Sandbox Code Playgroud)

我的main.cpp档案:

#include "GENERATED/header.h"
void f() { /* something */ }
Run Code Online (Sandbox Code Playgroud)

目前此代码无法编译.我该如何解决?是否有可能呢?

ere*_*eOn 8

根据某些"编译配置文件",您似乎想要使用不同的标头.

-D我宁愿建议使用该-I指令来指定include目录,而不是解决方案.

鉴于您有以下文件树:

/
  debug/
    header.h
  release/
    header.h
Run Code Online (Sandbox Code Playgroud)

main.cpp:

#include "header.h"

/* some instructions, not relevant here */
Run Code Online (Sandbox Code Playgroud)

在您Makefile(或您使用的任何工具)中,只需指定要使用的正确包含目录,具体取决于您想要的任何原因:

g++ -I debug main.cpp // Debug mode

g++ -I release main.cpp // Release mode
Run Code Online (Sandbox Code Playgroud)

重要注意事项:我不知道您是否打算将其用作调试/释放开关.但是,这样做会很奇怪:接口(包含的.h文件)不应该在release和之间改变debug.如果你需要这个,通常的方法是使用定义来启用/禁用代码的某些部分,主要是在.c(和.cpp)文件中.


hka*_*ser 6

你不能直接这样做,但这是可能的:

c++ -D "GENERATED=\"build/generated-content\"" main.cpp  

#define INCLUDE_NAME() GENERATED "/header.h"
#include INCLUDE_NAME()
Run Code Online (Sandbox Code Playgroud)

编辑:此解决方案不起作用(请参阅下面的评论)

本质上,任何#include不符合“正常”语法(#include ""#include <>)但属于该形式的语句#include SOMETHING都会导致 SOMETHING 被预处理,之后它必须符合“正常”语法之一。SOMETHING 可以是任何 pp-token 序列。

但是在这种情况下,结果(由 GCC 生成)是...

#include "build/generated-content" "/header.h"

...不符合“正常”语法之一。

  • 那太疯狂了,给了我非常邪恶的想法。它是标准的吗?很难用谷歌搜索。 (2认同)