But de la macro majuscule VOID et du typedef INT dans winnt.h

Quelqu’un winnt.h -il une idée de pourquoi il existe une macro VOID majuscule définie dans l’en-tête winnt.h ?

Pour rendre les choses plus confuses, VOID est une macro, alors que CHAR , SHORT , INT et LONG sont des typedefs.

Voir l’extrait pertinent de winnt.h :

 #ifndef VOID #define VOID void typedef char CHAR; typedef short SHORT; typedef long LONG; #if !defined(MIDL_PASS) typedef int INT; #endif #endif 

Une raison historique peut-être de faire le VOID* pointer au lieu du void* pointer ?

EDIT : Ce qui est encore plus troublant, c’est de voir les gens utiliser VOID au lieu de void lorsqu’ils font de la programmation Windows aujourd’hui . Vous pouvez également le voir dans le cadre de la documentation MSDN, par exemple http://msdn.microsoft.com/en-us/library/bb205867(v=vs.85).aspx

La raison initiale est que l’API Win32 était à l’origine supposée être indépendante de la langue. Ils ont donc créé leurs propres noms (suivant leur convention de dénomination), puis ont fourni une implémentation C de celui-ci. En réalité, une grande partie de ce qu’ils ont défini a tendance à être ignoré par la plupart des gens utilisant d’autres langues (et même largement par les personnes utilisant C, d’ailleurs).

Pour ce qui est de savoir pourquoi VOID est un #define au lieu d’un typedef , c’est assez simple: le typedef requirejs serait typedef void VOID; , mais C (comme “défini” par les compilateurs C de Microsoft à cette époque) ne le permet tout simplement pas, alors ils utilisent une macro à la place.

L’API Windows est ancienne. Vraiment vieux Plus ancien que le C standard ancien.

Cela signifie qu’au début, l’API Windows devait gérer tous les types de compilateurs C, avec différents niveaux de prise en charge linguistique. Certains pourraient ne pas supporter le void . Certains pourraient avoir un type int incompatible avec ce que Windows pensait être. Certains pourraient ne pas comprendre short . Pour contourner ce problème, l’API Windows fournit des équivalents portables en majuscules, associés à tout ce qui fonctionne pour ce compilateur particulier.

Bien sûr, avec les compilateurs modernes, les choses se sont stabilisées. Tout le monde soutient le void , par exemple. Cependant, pour maintenir la compatibilité avec l’ancien code qui utilise ces macros majuscules, les #define s et les typedef s doivent restr.