#ifndef EIGHT_BIT
#define THIRTYTWO_BIT // default 32 bit
#endif
#ifdef THIRTYTWO_BIT
#define WORD unsigned long
#define WORDLENGTH 4
#if defined(WIN32) && !defined(__GNUC__)
#define WORD64 unsigned __int64
#else
#define WORD64 unsigned long long
#endif
// THIRTYTWO_BIT
#endif
#ifdef EIGHT_BIT
#define WORD unsigned short
#define WORDLENGTH 4
// EIGHT_BIT
#endif
Réponses
Trop de publicités?C'est juste une définition de constantes (aka define) dépendant de la #define EIGHT_BIT.
Si EIGHT_BIT est défini, WORD signifie unsigned short et WORDLENGTH est 4. Sinon, WORD est unsigned long et WORDLENGTH est également 4. De plus, WORD64 sera défini comme unsigned long, sauf si vous êtes sur un système WIN32 et que vous n'utilisez pas GCC.
Le "code" ne fait que configurer les symboles du préprocesseur pour tout code "réel" que vous avez. Si un symbole appelé EIGHT_BIT
est définie avant que ce code ne soit prétraité, elle met en place WORD
y WORDLENGTH
en conséquence (bien que WORDLENGTH
est suspecte), et il configurera les valeurs différemment si l'option EIGHT_BIT
n'est pas déjà défini.
La première chose à noter à propos de ce code est qu'aucune partie ne sera compilée en C. Chaque ligne qui n'est pas un espace blanc ou un commentaire commence par un dièse ( #
), ce qui signifie que ce sont des directives de préprocesseur. Une directive de préprocesseur modifie le code avant même qu'il ne parvienne au compilateur. Pour plus d'informations sur les directives de préprocesseur, voir cet article .
Maintenant que nous savons tout cela, regardons le code :
#ifndef EIGHT_BIT
#define THIRTYTWO_BIT // default 32 bit
#endif
Si la macro EIGHT_BIT
n'est pas définie, définissez une autre macro appelée THIRTYTWO_BIT
. Cela fait très probablement référence au nombre de bits dans un mot sur un processeur. Ce code est destiné à être multiplateforme, ce qui signifie qu'il peut fonctionner sur un certain nombre de processeurs. L'extrait que vous avez publié concerne la gestion de différentes largeurs de mots.
#ifdef THIRTYTWO_BIT
#define WORD unsigned long
#define WORDLENGTH 4
Si la macro THIRTYTWO_BIT
est définie, alors définissez une WORD
pour être un unsigned long
qui a un WORDLENGTH
de 4 (vraisemblablement des octets). Notez que cette affirmation n'est pas nécessairement vraie, car la norme C garantit uniquement qu'un fichier long
sera au moins aussi longue qu'une int
.
#if defined(WIN32) && !defined(__GNUC__)
#define WORD64 unsigned __int64
#else
#define WORD64 unsigned long long
#endif
S'il s'agit d'une plate-forme Windows 32 bits et que le compilateur GNU C n'est pas disponible, utilisez le type de données spécifique à Microsoft pour les mots 64 bits ( unsigned __int64
). Sinon, utilisez le type de données GNU C ( unsigned long long
).
// THIRTYTWO_BIT
#endif
Chaque #if
y #ifdef
doit correspondre à une directive #endif
pour délimiter l'endroit où se termine la section conditionnelle. Cette ligne termine la section #ifdef THIRTYTWO_BIT
déclaration faite précédemment.
#ifdef EIGHT_BIT
#define WORD unsigned short
#define WORDLENGTH 4
// EIGHT_BIT
#endif
Si le processeur cible a une largeur de mot de 8 bits, alors définissez un fichier WORD
pour être un unsigned short
et définissez le WORDLENGTH
pour être 4 (encore une fois, vraisemblablement en octets).