簡體   English   中英

C ++匿名變量

[英]C++ anonymous variables

為什么這不起作用?

 0. #define CONCAT(x, y) x ## y
 1. 
 2. #define VAR_LINE(x) \
 3.     int CONCAT(_anonymous, __LINE__) = x
 4. 
 5. #define VAR_LINE2(x) \
 6.     int _anonymous ## x = 1
 7.
 8. int main()
 9. {
10.     VAR_LINE(1);
11.     VAR_LINE(1);
12.     VAR_LINE(1);
13.     VAR_LINE2(__LINE__);
14. }

上述宏觀擴張的結果

int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous13 = 1;

如果我不必將__LINE__宏寫為參數,那將會很方便。

我認為這個問題非常清楚。 我希望能夠生成匿名變量,以便在同一范圍內聲明多個變量時,此宏不會因重定義錯誤而失敗。 我的想法是使用預定義的__LINE__宏,因為不會像這樣在同一行上聲明變量。 但宏觀擴張困擾我,你能幫忙嗎?

更新:正確答案

感謝Luc Touraille。 但是,建議的解決方案存在一個小問題。 操作數和##運算符之間必須有空格(顯然標准說明不然,但如果運算符和操作數之間沒有空格,則PS3風格的GCC不會正確擴展宏)。

#define _CONCAT(x,y) x ## y
#define CONCAT(x,y) _CONCAT(x,y)

VAR_LINE宏現在產生:

int _anonymous10 = 1;
int _anonymous11 = 1;
int _anonymous12 = 1;

這已經過驗證可以在Win32(Visual Studio 2008),XBOX360(Xenon)和PS3下運行。

您需要添加一個間接級別,以便擴展__LINE__

#define _CONCAT_(x,y) x ## y
#define CONCAT(x,y) _CONCAT_(x,y)

#define VAR_LINE(x) int CONCAT(_anonymous, __LINE__) = x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM