Le problème est en fait un véritable PITA, car certaines API ou SDK redéfinissent des éléments couramment utilisés. J'ai eu l'occasion de constater que les fichiers d'en-tête d'un logiciel de traitement de cartes (SIG) redéfinissaient les mots-clés TRUE et FALSE (généralement utilisés par le SDK Windows) en littéraux entiers au lieu des mots-clés true et false (évidemment, cela peut casser QUELQUE CHOSE). Et oui, la célèbre blague "#define true false" est pertinente.
définir ne sentirait jamais un typedef ou une constante déclarée en C \C ++ code car le préprocesseur n'analyse pas le code, il ne recherche que les # déclarations. Et il modifie le code avant de le donner à l'analyseur syntaxique. Donc, en général, ce n'est pas possible.
https://msdn.microsoft.com/en-us/library/5xkf423c.aspx?f=255&MSPPError=-2147217396 Celui-ci n'est pas encore portable, bien qu'il y ait eu une demande connue pour l'implémenter dans GCC. Je pense que cela compte aussi comme une "extension" dans MSVC. C'est une déclaration du compilateur, pas du préprocesseur, donc il ne "sentira" pas les macros définies, il détectera seulement les typedefs en dehors du corps de la fonction. L'expression "full type" signifie qu'il réagira à la définition complète, en ignorant les déclarations comme "class SomeClass ;". Utilisez-le à vos risques et périls.
Edit : apparemment il est aussi supporté sur MacOS maintenant et par le compilateur Intel avec l'option -fms-dialect (AIX). \Linux ?)