C++ 我可以在#include指令中使用预处理器变量吗?
这就是我想做的:C++ 我可以在#include指令中使用预处理器变量吗?,c++,C++,这就是我想做的: $ c++ -D GENERATED=build/generated-content main.cpp 我的main.cpp文件: #include "GENERATED/header.h" void f() { /* something */ } 目前这段代码无法编译。我该怎么修?是否可能呢?你不能直接这么做,但这是可能的: c++ -D "GENERATED=\"build/generated-content\"" main.cpp #define INCLUDE
$ c++ -D GENERATED=build/generated-content main.cpp
我的main.cpp
文件:
#include "GENERATED/header.h"
void f() { /* something */ }
目前这段代码无法编译。我该怎么修?是否可能呢?你不能直接这么做,但这是可能的:
c++ -D "GENERATED=\"build/generated-content\"" main.cpp
#define INCLUDE_NAME() GENERATED "/header.h"
#include INCLUDE_NAME()
编辑:此解决方案无效(请参阅下面的注释) 本质上,任何
#include
语句不符合“正常”语法(无论是#include”“
还是#include
),但其形式为#include SOMETHING
都将导致对某个内容进行预处理,之后它必须符合“正常”语法之一。有些东西可以是任何pp标记序列
但是在这种情况下,结果(由GCC生成)是
#包括“生成/生成的内容”“/header.h”
。。。它不符合一个“正常”的语法。< P>我不相信C++标准中包含的内容,所以它将取决于单个编译器的供应商是否支持它。我想没有人会 然而,几乎每个编译器都允许您为标题指定搜索目录。通常是/i选项 因此,这将是:
$ c++ -i build/generated-content main.cpp
My main.cpp file:
#include "header.h"
void f() { /* something */ }
似乎您希望根据某些“编译配置文件”使用不同的头文件 我建议使用
-I
指令来指定include目录,而不是-D
解决方案
假设您具有以下文件树:
/
debug/
header.h
release/
header.h
main.cpp
:
#include "header.h"
/* some instructions, not relevant here */
在您的Makefile
(或您使用的任何工具)中,只需指定要使用的适当的include目录,具体取决于您想要的原因:
g++ -I debug main.cpp // Debug mode
g++ -I release main.cpp // Release mode
重要提示:我不知道您是否打算将其用作调试/释放开关。但是,这样做会很奇怪:界面(包含的
.h
文件)不应该在release
和debug
之间更改。如果需要,通常的方法是使用defines启用/禁用代码的某些部分,主要是在.c
(和.cpp
)文件中。这太疯狂了,给了我非常邪恶的想法。这是标准的吗?很难用谷歌搜索。是的,这是标准(第[16.2.4]条)。我相应地编辑了我的答案。@int:See.hkaiser,使用GCC这将导致#include“build/generated content”“/header.h”
无效。噢,你说得对。正如我在上面写的,在预处理之后,它必须符合“正常”语法之一。。。在预处理之后发生字符串连接。我会考虑另一种解决办法。