2009-08-18 58 views
2

如何編寫當兩個指針a & b具有不同的基本類型時生成編譯錯誤的宏CHECK(a,b)。如何在指針類型不同時生成編譯錯誤?

CHECK((int*)0, (char*)0) -> compilation error 
CHECK((int*)0, (int*)0) -> works 

我正在尋找一些C89代碼,但C99 + gcc擴展也會。

+0

你所說的「基本型」是什麼意思? – 2009-08-18 08:26:29

+0

for int *基類型爲int – Alexandru 2009-08-18 08:28:04

+0

您可以在C++模式下編譯嗎?那麼這很容易。 – sbi 2009-08-18 08:36:27

回答

4

編輯現在適用於任何類型的,不只是三分球

東西從Linux內核或多或少提升,使用GCC擴展typeof()

這產生在編譯時警告,它也適用於整數指針類型

#define CHECK(a, b) do { \ 
    typeof(a) _a; \ 
    typeof(b) _b; \ 
    (void) (&_a == &_b); \ 
    } while (0) 

int main(int argc, char **argv) 
{ 
    int *foo; 
    int *bar; 
    char *baz; 

    CHECK(foo, bar); 
    CHECK(bar, baz); 
    return 0; 
} 
+0

它不適用於指向整數類型的指針 - 編譯器會將較小的類型提升爲較大的類型,並且不會出現錯誤 – qrdl 2009-08-18 12:57:21

+0

您是否嘗試過? 該程序gcc輸出以下內容:'a.c:16:警告:不同指針類型的比較缺少演員' 我總是用'-Werror'標誌編譯,順便說一句。 – Hasturkun 2009-08-18 14:03:21

+0

無論如何,指針類型不會得到提升,這是沒有意義的。他們的解除引用的內容可能,但他們沒有在這裏進行審查。 – Hasturkun 2009-08-18 14:07:03

0

我不知道如何使用宏。如果你可以使用C++,那麼看看here

0

你可以試試這個方法:

#define CHECK(A,B) do { typeof(*A) _A; typeof(*B) _B; _A = _B; } while (0) 

如果你的基本類型,而不是整數類型(CHAR,INT,短,長,很長很長),類型將不會被提升,因此分配_A = _B將會失敗。

我不認爲有辦法使它適用於整數類型。