2009-08-18 4 views
2

Comment écrire une macro CHECK (a, b) qui génère une erreur de compilation lorsque les deux pointeurs & b ont un type de base différent. Je recherche du code C89, mais les extensions C99 + gcc le feront aussi.Comment générer une erreur de compilation lorsque les types de pointeurs diffèrent?

+0

Que voulez-vous dire par « type de base »? –

+0

pour int * le type de base est int – Alexandru

+0

Pouvez-vous compiler en mode C++? Alors ce serait facile. – sbi

Répondre

4

EDIT fonctionne maintenant pour tout type, pas seulement des pointeurs

quelque chose de plus ou moins soulevé du noyau Linux, en utilisant l'extension de GCC typeof().

Cela génère un avertissement au moment de la compilation, il fonctionne aussi pour les types de pointeur entier

#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

Cela ne fonctionnera pas pour les pointeurs sur les types entiers - le compilateur fera la promotion d'un type plus petit à un plus grand et aucune erreur ne se produira – qrdl

+0

Avez-vous essayé? pour ce programme gcc affiche les informations suivantes: 'a.c: 16: avertissement: la comparaison de types de pointeurs distincts manque de cast' Je compile toujours avec le drapeau' -Werror', btw. – Hasturkun

+0

Quoi qu'il en soit, les types de pointeurs ne sont pas promus, ce qui aurait peu de sens. leur contenu déréférencé pourrait, mais ils ne sont pas examinés ici. – Hasturkun

0

Je ne sais pas comment le faire en utilisant des macros. Si vous pouvez utiliser C++, alors jetez un oeil here

0

Vous pouvez essayer cette façon:

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

Si vos types de base et non types entiers (char, int, court, long, long long), les types ne sera pas promu, donc l'affectation _A = _B échouera.

Je ne pense pas qu'il existe un moyen de le faire fonctionner pour les types entiers.

Questions connexes