2010-06-12 99 views
0

我工作的一個項目,我有這樣的代碼如下:GCC預處理器內聯函數名

#define NAME() Array 

inline NAME()* NAME()_init (void* arg0){return (NAME()*)Object_init(arg0);} 

但我得到以下結果:

inline Array* Array _init (void* arg0){return (Array*)Object_init(arg0);} 

隨着之間的空間「數組」和「_init」因爲這是一個函數名,所以我顯然不想要這個空間。有誰知道如何獲得空間?

回答

1

你應該改變語義是這樣的:

#define NAME(X) Array##X 
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}

編輯:至少它與GNU CPP。

EDIT2:與-ansi -pedantic也試過,似乎沒有任何警告的工作...

+0

它可能是,但OP指定GNU預處理器,並我已經測試過它 – ShinTakezou 2010-06-12 17:26:49

+0

對不起,我的錯。 C99增加了對空參數的支持。 – 2010-06-12 17:40:58

2

的唯一途徑兩個標記合併成一個(例如,調用NAME()_init的結果結合)是使用連接運算符(##)。您需要這樣做:

#define REAL_CONCATENATE(x, y) x ## y 
#define CONCATENATE(x, y) REAL_CONCATENATE(x, y) 

#define NAME() Array 
inline NAME()* CONCATENATE(NAME(), _init) (void* arg0){return (NAME()*)Object_init(arg0);} 

是的,the extra level of indirection is necessary

注意,你並不需要,如果你不帶任何參數使用函數宏,所以你可以很容易地使用:

#define NAME Array 
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);} 
+0

它被稱爲令牌粘貼,而不是串聯 - 字符串連接發生在標記之後,粘貼之前,並且不需要任何操作符。 – 2010-06-12 17:37:50

+0

@Pete:C和C++語言標準都使用_concatenate; _這並不意味着_token concatenation_與_string literal concatenation_(或者任何其他形式的連接,就此而言)是相同的。 – 2010-06-12 17:40:10