2009-08-18 12 views
2

Wie schreibe ich ein Makro CHECK (a, b), das Kompilierungsfehler generiert, wenn die beiden Zeiger a & b einen anderen Basistyp haben.Wie erzeuge ich einen Kompilierungsfehler, wenn sich die Zeigertypen unterscheiden?

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

Ich interessiere mich für einige C89-Code, aber C99 + gcc Erweiterungen werden auch tun.

+0

Was meinst du mit „Basistyp“? –

+0

für int * der Basistyp ist int – Alexandru

+0

Können Sie im C++ - Modus kompilieren? Dann wäre es einfach. – sbi

Antwort

4

EDIT arbeitet nun für jede Art, nicht nur Zeiger

Etwas mehr oder weniger aus dem Linux-Kernel angehoben, typeof() die GCC-Erweiterung verwenden.

Das bei der Kompilierung eine Warnung erzeugt, es funktioniert auch für Integer-Zeigertypen

#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

Es wird nicht funktionieren für Zeiger auf Integer-Typen - Compiler wird kleineren Typ zu größeren fördern und kein Fehler wird – qrdl

+0

haben Sie es versucht? für dieses Programm gcc gibt Folgendes aus: 'a.c: 16: Warnung: Vergleich der verschiedenen Zeigertypen fehlt eine Besetzung Ich kompiliere immer mit dem' -Werror 'Flag, BTW. – Hasturkun

+0

Wie auch immer, Zeiger Typen werden nicht gefördert, das wäre sehr wenig sinnvoll. ihre dereferenzierten Inhalte könnten, aber sie werden hier nicht untersucht. – Hasturkun

0

Ich weiß nicht, wie man es mit Makros macht. Wenn Sie C++ verwenden können, dann schauen Sie here

0

Sie auf diese Weise versuchen:

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

Wenn Ihre Basistypen und nicht Integer-Typen (char, int, kurz, lang, lang lang), Typen wird nicht beworben, daher wird die Zuweisung _A = _B fehlschlagen.

Ich glaube nicht, es gibt eine Möglichkeit, es für Integer-Typen arbeiten zu lassen.

Verwandte Themen