2 votes

Quelqu'un peut-il m'expliquer ce code

#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

5voto

Tobias Langner Points 6354

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.

5voto

Jim Buck Points 10839

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.

2voto

Zach Rattner Points 5849

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X