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 ?
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 ?
#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
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
.
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.
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 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.