2013-08-30 26 views
1

我想要做的就是使用宏來生成類名,它需要一些concat,就是這樣。除了它慘敗之外。這真的磨礪我的齒輪。多級c/C++宏 - 評估結果後的空白?

我有一個宏定義在什麼地方...

#define CLASSNAME myclassname 
... 

,我試圖讓一個類名生成與類型...

#define GETNAME(x) x 
#define UNIQUENAME(T) GETNAME(CLASSNAME) ## _ ## T 

UNIQUENAME(int) //I want it to make: myclassname_int 
        // instead it makes: myclassname _int 
// SUBTLE, but screws everything up! can't have that space in the middle. 

我檢查了另一種配置..

#define UNIQUENAME(T) GETNAME(CLASSNAME)M ## M_ ## T 
//which returns: myclassname MM_int 

所以這個空間肯定來自GETNAME結果。唯一的問題是,我不知道如何擺脫它。我已經嘗試了太久了。

任何事情都會有幫助。 謝謝!

+0

如果您使用的是C++,那麼不要將它標記爲C.如果您使用的是C++,那麼您可以避免使用宏。然後你可以使用編譯器的安全功能,在這些方面更好。你聽說過模板嗎?如果我理解正確,可能是您問題的最佳解決方案 –

+0

是的,那正是我想要的。模板。不幸的是,我使用的編譯器只支持C++的一個子集,並且沒有模板。所以我用宏來製作它們。除了生成的類名中間的那個愚蠢的空間之外,我有一切工作。據我所知,預處理器是相當標準的(除了空間)。 – extracrispy

+0

代替使用宏的路線,寫一個腳本(perl等)來根據需要爲各種類型生成頭文件和源文件。這只是一個簡單的替代。 –

回答

1
#define ClassName  myclassname 

#define Paste(a, b)  a ## _ ## b 
#define Helper(a, b) Paste(a, b) 
#define UniqueName(T) Helper(ClassName, T) 

UniqueName(int) 

Here是宏擴展的解釋以及爲什麼我們需要這樣的輔助宏。

+0

好吧,我試過了。有趣...返回「CLASSNAME_int」 – extracrispy

+0

改爲UNIQUENAME(T)UNIQUENAMEHelper(GETNAME(CLASSNAME),T)返回幾乎正確的結果,但它有愚蠢的空間。 「myclassname _int」 – extracrispy

+0

我更新了代碼。 –