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.