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?
Répondre
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;
}
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
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
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
Je ne sais pas comment le faire en utilisant des macros. Si vous pouvez utiliser C++, alors jetez un oeil here
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.
- 1. Puis-je générer une erreur de compilation en fonction du type du champ étant annoté
- 2. ejabberd Erreur de compilation
- 3. Erreur de compilation
- 4. site Erreur de compilation
- 5. Comment P/Invoke lorsque des pointeurs sont impliqués
- 6. Erreur de compilation sur BlackBerry
- 7. erreur de compilation lors de la compilation de classe dans une autre
- 8. Strange char * erreur de compilation?
- 9. Erreur de compilation Visual C++
- 10. erreur de compilation étrange traitant Winnt.h
- 11. Erreur de compilation: Valeur invalide dans l'affectation lorsque vous tentez de changer l'origine d'un UISwitch
- 12. bizarre erreur de compilation C#: héritage cyclique
- 13. Erreur d'assemblage en ligne, contrecarrant les tentatives de compilation gcc
- 14. Pourquoi appeler Dispose() sur BinaryReader entraîne une erreur de compilation?
- 15. Erreur de compilation du navigateur pour Flex
- 16. Erreur de compilation Web App - Référence ASP.NET
- 17. C++ "conversion perd qualificatifs" erreur de compilation
- 18. erreur de compilation sur cette chaîne
- 19. erreur de compilation avec l'instruction oracle
- 20. erreur de compilation maven: classes dupliquées
- 21. Supprimer NULL, mais aucune erreur de compilation
- 22. comment savoir rapidement quels fichiers diffèrent dans les révisions mercurielles
- 23. Erreur de requête d'accès - Types de données Null & Variant - Comment corriger cette erreur?
- 24. Comment puis-je obtenir tlbimp pour ne pas générer automatiquement des assemblys pour les types référencés?
- 25. Indigène Erreur de référence lors de la compilation
- 26. BlogEngine.Net - « Impossible de générer une classe temporaire » erreur
- 27. Comment Ruby et PHP diffèrent-ils dans leurs moteurs d'évaluation?
- 28. Définition de pointeurs de fonction
- 29. Erreur de compilation lors du portage de gfortran vers ifort
- 30. longueur de chaîne entre les pointeurs
Que voulez-vous dire par « type de base »? –
pour int * le type de base est int – Alexandru
Pouvez-vous compiler en mode C++? Alors ce serait facile. – sbi