[英]Can I use a preprocessor variable in #include directive?
這就是我想要做的:
$ c++ -D GENERATED=build/generated-content main.cpp
我的main.cpp
文件:
#include "GENERATED/header.h"
void f() { /* something */ }
目前此代碼無法編譯。 我該如何解決? 是否有可能呢?
根據某些“編譯配置文件”,您似乎想要使用不同的標頭。
我寧願建議使用-I
指令來指定包含目錄,而不是-D
解決方案。
鑒於您有以下文件樹:
/
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
)文件中。
你不能直接這樣做,但這是可能的:
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"
...不符合“正常”語法之一。
我不相信C ++標准中涵蓋了這一點,因此由各個編譯器供應商決定是否支持它。 我認為沒有。
但是,幾乎每個編譯器都允許您為標頭指定搜索目錄。 它通常是/ i選項。
所以它會是:
$ c++ -i build/generated-content main.cpp
My main.cpp file:
#include "header.h"
void f() { /* something */ }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.