11 votes

Taille des valeurs #define

Si une valeur est définie comme

#define M_40 40

La taille est-elle la même que celle d'un short (2 octets) ou comme une char (1 octet) ou int (4 octets) ?

La taille dépend-elle du fait que vous soyez en 32 ou 64 bits ?

35voto

Brian R. Bondy Points 141769

#define n'a pas de taille car il ne s'agit pas d'un type mais d'une substitution de texte brut dans votre code C++. #define est une directive de prétraitement et s'exécute avant même que votre code ne commence à être compilé.

La taille du code C++ après substitution est celle de l'expression ou du code C++ que vous avez là. Par exemple, si vous suffixez avec L comme 102L alors il est vu comme un long, sinon sans suffixe, juste un int. Donc 4 octets sur x86 et x64 probablement, mais cela dépend du compilateur.

Peut-être que la section sur le littéral Integer de la norme C++ vous éclairera (section 2.13.1-2 de la norme C++03) :

Le type d'un littéral entier dépend de sa forme, de sa valeur et de son suffixe. S'il est décimal et n'a pas de suffixe, il a le premier des types suivants dans lequel sa valeur peut être représentée : int, long int ; si la valeur ne peut pas être représentée comme un long int, le comportement est indéfini. Si elle est octale ou hexadécimale et qu'elle n'a pas de suffixe, elle a le premier de ces types dans lequel sa valeur peut être représentée : int, unsigned int, long int, unsigned long int. S'il est suffixé par u ou U, son type est le premier de ces types. type est le premier des types suivants dans lesquels sa valeur peut être représentée dans lequel sa valeur peut être représentée : unsigned int, unsigned long int. S'il est est suffixé par l ou L, son type est le premier de ces types dans lesquels sa valeur peut être représentée : unsigned int, unsigned long int. premier de ces types dans lequel sa valeur peut être représentée : long int, unsigned long int. S'il est suffixé par ul, lu, uL, Lu, Ul, lU, UL ou LU, son type est unsigned long int

8voto

Adam Shiemke Points 2791

Un simple entier va être implicitement converti en int dans tous les calculs et les affectations.

#define indique simplement au préprocesseur de remplacer toutes les références à un symbole par quelque chose d'autre. C'est la même chose que de faire un find-replace global sur votre code et de remplacer M_40 con 40 .

2voto

James Curran Points 55356

Une valeur #define n'a pas de taille, spécifiquement. C'est juste une substitution de texte. Cela dépend du contexte de l'endroit (et de ce qui) qui est substitué.

Dans votre exemple, où vous utilisez M_40 la compilation verra 40 et le traitent généralement comme dans int .

Cependant, si nous l'avions fait :

void SomeFunc(long);

SomeFunc(M_40);

Il sera traité comme un long.

2voto

Simon Walker Points 913

Les macros du préprocesseur sont littéralement insérées pendant l'étape de prétraitement de la compilation.

Par exemple, le code

#define N 5

int value = N;

sera échangé contre

int value = 5;

quand le compilateur le voit. Il n'a pas de taille propre en tant que telle.

1voto

Carl Norum Points 114072

Le préprocesseur ne fait qu'une simple substitution de texte, donc le fait que votre constante se trouve dans un fichier de type #define n'a pas d'importance. Tout ce que dit la norme C est que "Chaque constante doit avoir un type et la valeur d'une constante doit être dans la gamme des valeurs représentables pour son type." Le C++ ne devrait pas trop s'en écarter.

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