这就是我想要做的:
$ 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)
目前此代码无法编译.我该如何解决?是否有可能呢?
根据某些"编译配置文件",您似乎想要使用不同的标头.
-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)文件中.
你不能直接这样做,但这是可能的:
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"
...不符合“正常”语法之一。