2016-01-22 33 views
1

當我嘗試編譯這個(我試圖理解這裏有什麼##)時,我得到一個錯誤:「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; 
} 
+0

你期望什麼?只要查看'##'_concatenation operator_所做的事情(以及爲什麼它被這樣調用)。 – Olaf

+0

編譯器抱怨的「i2」變量在哪裏。我沒有使用它。 –

+0

當你將函數A()中的參數作爲參數傳遞給函數A時,預處理程序是否將它作爲i並與之連接? – tigris

回答

3

預處理之後,這句話

printf("%d \n", A(i,j)); 

變爲:

printf("%d \n", i2-j); 

正如你所看到的,有一個在你的代碼中沒有變量i2。因此,錯誤。 ##被稱爲token pasting operator,其中兩個標記i2在一起,它變成i2

+0

這清除了事情,非常感謝! –

3

##連接其操作數。因此,對於A(i,j),您得到i##2-y,它們在連接後變爲i2-y。正如你所說,你沒有在你的代碼中的任何地方定義一個變量i2,你會得到一個錯誤i2不存在。

+0

這清除了一切,非常感謝! –

5

##僅僅意味着在兩個表達式(「粘貼在一起」)中形成新的預處理器常量。

您的宏擴展爲i##2-j,這與i2-j相同。您沒有任何內容稱爲i2,這是編譯器錯誤。

+0

這清除了一切,非常感謝! –