當我嘗試編譯這個(我試圖理解這裏有什麼##)時,我得到一個錯誤:「i2 undeclared」。我沒有'通過這個名字有一個變量,這是我所有的代碼。GCC編碼錯誤(codeblocks)
#include <stdio.h>
#define A(x,y) x##2-y
int main()
{
int i = -1;
int j = -2;
printf("%d \n", A(i,j));
return 0;
}
當我嘗試編譯這個(我試圖理解這裏有什麼##)時,我得到一個錯誤:「i2 undeclared」。我沒有'通過這個名字有一個變量,這是我所有的代碼。GCC編碼錯誤(codeblocks)
#include <stdio.h>
#define A(x,y) x##2-y
int main()
{
int i = -1;
int j = -2;
printf("%d \n", A(i,j));
return 0;
}
預處理之後,這句話
printf("%d \n", A(i,j));
變爲:
printf("%d \n", i2-j);
正如你所看到的,有一個在你的代碼中沒有變量i2
。因此,錯誤。 ##
被稱爲token pasting operator,其中貼兩個標記i
和2
在一起,它變成i2
。
這清除了事情,非常感謝! –
##
連接其操作數。因此,對於A(i,j)
,您得到i##2-y
,它們在連接後變爲i2-y
。正如你所說,你沒有在你的代碼中的任何地方定義一個變量i2
,你會得到一個錯誤i2
不存在。
這清除了一切,非常感謝! –
##
僅僅意味着在兩個表達式(「粘貼在一起」)中形成新的預處理器常量。
您的宏擴展爲i##2-j
,這與i2-j
相同。您沒有任何內容稱爲i2
,這是編譯器錯誤。
這清除了一切,非常感謝! –
你期望什麼?只要查看'##'_concatenation operator_所做的事情(以及爲什麼它被這樣調用)。 – Olaf
編譯器抱怨的「i2」變量在哪裏。我沒有使用它。 –
當你將函數A()中的參數作爲參數傳遞給函數A時,預處理程序是否將它作爲i並與之連接? – tigris