2012-04-30 22 views
10

Possible Duplicate:
Creating C macro with ## and LINE (token concatenation with positioning macro)創建宏__LINE__使用不同的變量名

我試圖使用__LINE__宏來產生不同的變量名。我有一個名爲Benchmark的範圍基準類(位於utils名稱空間中),它的構造函數接受一個字符串。下面是我創建的宏定義:

#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__)) 

不幸的是這將導致以下錯誤:

<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization

這使我得出結論的__LINE__宏不會得到擴展。我根據this post創建了我的macross。你有什麼想法爲什麼__LINE__沒有擴大?

編輯:可能編譯器信息也是相關的。我使用Visual Studio 2010中

+0

嗯。你嘗試過'bm ## __LINE__'(有空格)嗎? – Cameron

+0

@Cameron我對你的評論感謝,但沒有任何改變。 –

+0

好的,再試一次:'#define _BENCHMARK_SCOPE(line)utils :: Benchmark bm ## line(...'with'#define BENCHMARK_SCOPE _BENCHMARK_SCOPE(__ LINE __)' – Cameron

回答

13

您需要使用的2個宏組合:

#define COMBINE1(X,Y) X##Y // helper macro 
#define COMBINE(X,Y) COMBINE1(X,Y) 

,然後用它作爲,

COMBINE(x,__LINE__); 
+0

您是否知道爲什麼需要使用兩個宏? –

+1

@izomorphius,實際上你的問題是另一個問題的重複,在那裏它很好地解釋。我已經評論說,對你的問題,請檢查它。 – iammilind

5

試試這個代碼,我在一箇舊的項目中使用它

#define CONCATENATE_DIRECT(s1, s2) s1##s2 
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2) 
#ifdef _MSC_VER // Necessary for edit & continue in MS Visual C++. 
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__) 
#else 
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__) 
#endif 


int ANONYMOUS_VARIABLE(var) 

編輯:

我想你應該在Visual Studio中僅使用COUNTER也使用預編譯頭文件。

+0

它也適用於__LINE__。 –

3

您使用標記粘貼。這發生在之前遞歸宏 擴展(以便您可以使用令牌粘貼來獲取您想要調用的宏的名稱)。因此:

#define PASTE(a,b) a ## b 

將粘貼傳遞給PASTE確切的參數,然後嘗試擴大 所產生的新的令牌。爲了得到你想要的效果,你需要一個間接的 附加級別:

#define PASTE_HELPER(a,b) a ## b 
#define PASTE(a,b) PASTE_HELPER(a,b) 

這裏,前PASTE_HELPER是 調用的參數PASTE將擴大。