如何編寫當兩個指針a & b具有不同的基本類型時生成編譯錯誤的宏CHECK(a,b)。如何在指針類型不同時生成編譯錯誤?
CHECK((int*)0, (char*)0) -> compilation error
CHECK((int*)0, (int*)0) -> works
我正在尋找一些C89代碼,但C99 + gcc擴展也會。
如何編寫當兩個指針a & b具有不同的基本類型時生成編譯錯誤的宏CHECK(a,b)。如何在指針類型不同時生成編譯錯誤?
CHECK((int*)0, (char*)0) -> compilation error
CHECK((int*)0, (int*)0) -> works
我正在尋找一些C89代碼,但C99 + gcc擴展也會。
編輯現在適用於任何類型的,不只是三分球
東西從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;
}
我不知道如何使用宏。如果你可以使用C++,那麼看看here
你可以試試這個方法:
#define CHECK(A,B) do { typeof(*A) _A; typeof(*B) _B; _A = _B; } while (0)
如果你的基本類型,而不是整數類型(CHAR,INT,短,長,很長很長),類型將不會被提升,因此分配_A = _B
將會失敗。
我不認爲有辦法使它適用於整數類型。
你所說的「基本型」是什麼意思? – 2009-08-18 08:26:29
for int *基類型爲int – Alexandru 2009-08-18 08:28:04
您可以在C++模式下編譯嗎?那麼這很容易。 – sbi 2009-08-18 08:36:27