¿Cómo generar un error de comstackción cuando difieren los tipos de puntero?

¿Cómo escribo una macro CHECK (a, b) que genera un error de comstackción cuando los dos punteros a y b tienen un tipo base diferente?

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

Estoy buscando un código C89, pero las extensiones C99 + gcc también lo harán.

EDIT ahora funciona para cualquier tipo, no solo punteros

Algo más o menos elevado del kernel de Linux, utilizando la extensión GCC typeof() .

Esto genera una advertencia en el momento de la comstackción, también funciona para tipos de punteros de enteros

 #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; } 

No sé cómo hacerlo usando macros. Si puedes usar C ++, mira aquí

Puedes intentarlo de esta manera:

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

Si sus tipos base y no tipos enteros (char, int, short, long, long long), los tipos no se promoverán, por lo que la asignación _A = _B fallará.

No creo que haya una manera de hacerlo funcionar para tipos enteros.