2008-09-26 31 views
1

以下代碼片段應該取值爲PROJECT(在Makefile中定義) 並創建一個包含文件名。例如,如果PROJECT = classifier,那麼它應該在最後爲PROJECTINCSTR生成classifier_ir.h如何轉義C預處理器令牌中的下劃線?

我發現只要我不想在後綴中使用下劃線,這段代碼就會工作。然而,下劃線的使用不是可選的 - 我們的代碼庫在任何地方都使用它們。我可以解決這個問題,因爲PROJECT的值有限,但我想知道如何使下面的代碼段實際工作,並帶有下劃線。它可以逃脫嗎?

#define PROJECT classifier 

#define QMAKESTR(x) #x 
#define MAKESTR(x) QMAKESTR(x) 
#define MAKEINC(x) x ## _ir.h 
#define PROJECTINC MAKEINC(PROJECT) 
#define PROJECTINCSTR MAKESTR(PROJECTINC) 

#include PROJECTINCSTR 

編輯:編譯器應該嘗試包括classifier_ir.h,而不是PROJECT_IR.h。

+0

我希望你們有一個很好的理由因爲這對於後來出現的任何人來說都是完全不明顯的。你使用的是Makefile中的一個變量,執行一些瘋狂的宏魔法,這包括一個由宏命名的文件。有人會不知道發生了什麼。 – 2008-09-26 21:07:44

+0

我們正在手動編輯這個包含在使用此代碼的每個項目中,或自動做正確的事情之間取得平衡。原來這不是必需的,但我仍然有興趣瞭解爲什麼代碼不起作用。 – amo 2008-09-26 21:17:57

回答

7
#define QMAKESTR(x) #x 
#define MAKESTR(x) QMAKESTR(x) 
#define SMASH(x,y) x##y 
#define MAKEINC(x) SMASH(x,_ir.h) 
#define PROJECTINC MAKEINC(PROJECT) 
#define PROJECTINCSTR MAKESTR(PROJECTINC)
0

這準系統例如與海灣合作委員會(V4.1.2)的作品,並試圖包括「PROJECT_ir.h」

1

這個工作對我來說:

#define QMAKESTR(x) #x 
#define MAKESTR(x) QMAKESTR(x) 
#define MAKEINC(x) x ## _ir.h 
#define PROJECTINC(x) MAKEINC(x) 
#define PROJECTINCSTR MAKESTR(PROJECTINC(PROJECT)) 

#include PROJECTINCSTR