2013-01-18 50 views
3

是否有宏可以在編譯時返回一個唯一字符串,以便它可以用作一個Objective-c類的名稱?宏在編譯時返回一個唯一字符串

我在想是這樣的:

#define my_macro(params) \ 
@implementation my_macro_function_giving_unique_string_(MyTrickyRuntimeExtension) \ 
    //Do stuff \ 
@end \ 
+1

如果宏產生了一個「神奇」的名字,你怎麼知道它產生了什麼,所以你可以在別處參考它?你定義的大多數東西都需要被引用才能被使用。 – unwind

+0

解釋你實際*試圖達到的目標。 – Pubby

+0

@unwind我不想引用它,我想要啓動Obj-C運行時所需的+ Initialize方法,以便在啓動時運行一次。從那裏初始化方法會做一些魔術。 –

回答

1

有一個宏觀__COUNTER__在Visual Studio中預定義的,可以幫助

我以前iammilind建議

#define UNIQUE2(param) YourClassBaseNames##param 
#define UNIQUE1(param) UNIQUE2(param) 
#define UNIQUE UNIQUE1(__COUNTER__) 

class UNIQUE 
{ 

}; 

class UNIQUE 
{ 

}; 

計數器 - 返回新的計ECH時間

參考:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx

它也可在GCC

+1

'##'不會那樣工作。你必須通過其他的宏來做,或者使用Boost.PP:'BOOST_PP_CAT(base,__COUNTER __)'。 – Pubby

+0

@fen謝謝。 。 。它在叮噹中可用,你知道嗎? –

+1

應該在叮噹中可用:http://clang.llvm.org/docs/LanguageExtensions.html – fen

1

在C++中,它可以是:

#define UNIQUE_NAME2(LINE) Class##LINE 
#define UNIQUE_NAME1(LINE) UNIQUE_NAME2(LINE) 
#define UNIQUE_NAME UNIQUE_NAME1(__LINE__) 

而只是用它作爲:

class UNIQUE_NAME {}; 

[注:聲明每班1班,不希望前方宣佈它:)]

+0

我想過了。 1)你不能添加更加逼真的C-tor或D-tor。 2)除非'class UNIQUE_NAME {} var;'不能創建這個類的變量。也許使用'__COUNTER__' ... – borisbn

+0

@iammilind謝謝!你能解釋一下它是如何工作的嗎? 。我不擅長C++。 –

+0

@iammilind可能會添加'__FILE__'宏以避免類似的類名,在不同的文件中定義,但行數相等 – borisbn