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”
无效。噢,你说得对。正如我在上面写的,在预处理之后,它必须符合“正常”语法之一。。。在预处理之后发生字符串连接。我会考虑另一种解决办法。