簡體   English   中英

我可以在#include指令中使用預處理器變量嗎?

[英]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文件)不應該在releasedebug之間改變。 如果你需要這個,通常的方法是使用定義來啟用/禁用代碼的某些部分,主要是在.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM