2016-08-19 157 views
11

有沒有辦法連接2個字符串文字以形成包含路徑?包含路徑的字符串串聯

代碼存根:

#define INCLUDE_DIR "/include" 
#include INCLUDE_DIR "/dummy.h" 

綜觀this question,答案在不同的方向(編譯器命令行)點。這是here提到,它似乎是不可能的,但我想知道這個話題是否足夠挖掘。

(我有一個用例中,這是相關的,請只專注於這個問題的答案/評論。)

+0

您是否在尋找一個解決方案對於特定的編譯器還是需要交叉編譯器解決方案? (國際海事組織最好將其添加到問題中) – mvidelgauz

+0

Tjhere在現代C++中沒有這種能力。 –

+0

@mvidelgauz我使用gcc/llvm。我不會添加標籤,但我會說,編譯器特定的解決方案通常與此相關。 – Antonio

回答

0

看來這真的不可能。我將在這裏報告Eric Postpischil's answer的相關部分(他似乎不再活躍)。

編譯器將做上#include線宏替換(的每個C 2011 [N1570] 6.10.2 4),但語義尚未完全確定, 不能用來連接而無需額外 文件路徑部件來自C實施的幫助。所以,這一切讓你 做的是一些簡單的替換,提供了一個完整路徑,如:

#define MyPath "../../path/to/my/file.h" 
#include MyPath 

Link to documentation。特別地,這部分不會留下多少希望用於便攜式解決方案:

,通過該預處理標記對或一對"字符 一個<>之間預處理標記的序列被組合成的方法單頭名稱預處理令牌爲實現定義的 。


爲了完整起見,或許真的可以用https://stackoverflow.com/a/27830271/2436175嘗試。我會調查,當我有時間...

0

我不知道,這正是你想要什麼,但無論如何。

#define DECORATE(x)    <x> 
#define MAKE_PATH(root, file) DECORATE(root file) 

#define SYS_DIR(file)   MAKE_PATH(sys/, file) 
#define ARPA_DIR(file)   MAKE_PATH(arpa/, file) 


#include SYS_DIR(types.h) 
#include SYS_DIR(socket.h) 
#include ARPA_DIR(inet.h) 

注意,生成的文件名包含額外的空間 - <sys/ types.h>,所以它可能不會是一個交叉編譯器解決方案。但至少對我來說,它適用於GCC 4.8/4.9上的Linux主機。

P.S.如果有人可以用另一個編譯器檢查這個片段,這將是很好的,例如, MSVC。

+0

@AlterMann真的很奇怪的行爲,因爲它構建專有名稱並擴展標題,而不管錯誤消息如何。 – Sergio

+0

你有編譯器可以工作嗎?我同意人們會希望它這樣做...... – Antonio

+0

@Antonio我已經刪除了###連接,現在它可以工作,但有一個警告,請參閱我的編輯。 – Sergio

0

簡單地避免了空間和級聯(##),並使用<>它使所有simplier:

#include <QtCore/QtGlobal> 

#define QT_VERSION_PREFIX QT_VERSION_MAJOR.QT_VERSION_MINOR.QT_VERSION_PATCH 

#define _CONCATE(a, c) <a/QT_VERSION_PREFIX/a/private/c> 
#include _CONCATE(QtWidgets, qwidgettextcontrol_p.h) 
+0

'_CONCATE'?!?!? – Antonio