指针类型不同时如何生成编译错误?

当两个指针a和b具有不同的基类型时,如何编写生成编译错误的宏CHECK(a,b)。

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

我正在寻找一些C89代码,但C99 + gcc扩展也可以。

编辑现在适用于任何类型,而不仅仅是指针

使用GCC扩展typeof()或多或少从linux内核中提取的东西。

这会在编译时生成警告,它也适用于整数指针类型

 #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 ++,那么看看这里

你可以这样试试:

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

如果您的基类型而不是整数类型(char,int,short,long,long long),则不会提升类型,因此赋值_A = _B将失败。

我认为没有办法让它适用于整数类型。