2013-06-26 47 views
0

比方說,我有一個結構:的#define恆定結構

struct location 
{ 
    int x; 
    int y; 
}; 

然後我想在後面的程序中定義使用無效的位置:

#define INVALID_LOCATION (struct location){INT_MAX,INT_MAX} 

然而,當我使用,在我的程序,它結束了一個錯誤:

struct location my_loc = { 2, 3 }; 
if (my_loc == INVALID_LOCATION) 
{ 
    return false; 
} 

這將不會編譯。以這種方式使用複合文字是不合法的?我得到錯誤:

Invalid operands to binary expression ('struct location' and 'struct location')

+0

是不是你得到任何錯誤,如'錯誤:無效的預處理指令#DEFINE',或者它只是錯字? –

+1

你爲什麼不告訴我們編譯器說了些什麼?你可以看到?如果我們知道編譯器說了什麼,肯定會更容易一些?我的猜測是編譯器告訴你到底什麼是錯的。你應該學會閱讀和解釋編譯器發出的錯誤消息。您沒有包含錯誤的事實表明您只是忽略錯誤消息的內容。 –

回答

5

您不能比較結構與==相等。

5

我在代碼中看到了很多錯誤。

  1. #DEFINE - 沒有預處理器這樣的(使用#define
  2. 你不能比較使用==操作
  3. 沒有爲你的結構沒有名字的結構變量。 location是一個結構變量,不是結構體的名稱。所以你不能使用struct location my_loc
+0

@sigvardsen,您應該手動比較struct的各個成員.. – VoidPointer

1

請不要把空格與宏及其參數。

#define INVALID_LOCATION(location) { INT_MAX, INT_MAX } 

它不會編譯(有誤差:無效的操作數的二進制==或錯誤:前預期表達「{」令牌)

如果你在C++中,然後就可以重載==運算符。

在C中,可以定義一個函數如

int EqualLocation (const struct location *, const struct location *); 

用於比較。

使用此功能,您可以實現

int IsInValid location(const struct location *); 
2

你不能比較的struct你所提到的方式。將代碼修改爲如下所述。

struct location my_loc = { 2, 3 }; 
    if ((my_loc.x == INVALID_LOCATION.INT_MAX) && (my_loc.y == INVALID_LOCATION.INT_MAX)) 
    { 
     return false; 
    }