这就是我要做的事情:
$ c++ -D GENERATED=build/generated-content main.cpp
我的main.cpp
文件:
#include "GENERATED/header.h"
void f() { /* something */ }
目前此代码无法编译。我该如何解决?是否有可能呢?
答案 0 :(得分:8)
根据某些“编译配置文件”,您似乎想要使用不同的标头。
我建议使用-D
指令来指定包含目录,而不是-I
解决方案。
鉴于您有以下文件树:
/
debug/
header.h
release/
header.h
main.cpp
:
#include "header.h"
/* some instructions, not relevant here */
在Makefile
(或您使用的任何工具)中,只需指定要使用的正确包含目录,具体取决于您需要的原因:
g++ -I debug main.cpp // Debug mode
g++ -I release main.cpp // Release mode
重要注意事项:我不知道您是否打算将其用作调试/发布开关。但是,这样做会很奇怪:界面(包含的.h
文件)不应在release
和debug
之间更改。如果您需要这个,通常的方法是使用定义启用/禁用代码的某些部分,主要是在.c
(和.cpp
)文件中。
答案 1 :(得分:4)
你不能直接这样做,但这是可能的:
c++ -D "GENERATED=\"build/generated-content\"" main.cpp
#define INCLUDE_NAME() GENERATED "/header.h"
#include INCLUDE_NAME()
编辑:此解决方案不起作用(请参阅下面的评论)。
基本上,任何#include
语句都不符合“普通”语法(#include ""
或#include <>
),但格式为#include SOMETHING
会导致SOMETHING被预处理之后,它必须符合“正常”语法之一。 SOMETHING可以是pp-tokens的任何序列。
然而,在这种情况下,结果(由GCC生成)是......
#include "build/generated-content" "/header.h"
...不符合“普通”语法之一。
答案 2 :(得分:1)
我不相信C ++标准中涵盖了这一点,因此由各个编译器供应商决定是否支持它。我认为没有。
但是,几乎每个编译器都允许您为标头指定搜索目录。它通常是/ i选项。
所以它会是:
$ c++ -i build/generated-content main.cpp
My main.cpp file:
#include "header.h"
void f() { /* something */ }