Si une valeur est définie comme p>
est la taille identique à un est la taille dépend de la question de savoir si vous êtes 32 bits ou 64 bits? p> #define m_40 40 code> p>
court code> (2 octets) ou est-ce comme un
char code> (1 octet) ou
int code> (4 octets)? P>
5 Réponses :
La taille dans le code C après substitution est quelle que soit la taille est de ce que C ++ expression ou un code que vous avez là. Par exemple, si vous suffixe avec Peut-être le C ++ section littéral entier de norme effacer pour vous (section 2.13.1-2 du C ++ 03 standard): p>
Le type d'un littéral entier dépend
sur sa forme, la valeur, et le suffixe. Si ça
est décimal et n'a pas de suffixe, il a
le premier de ces types dans lesquels sa
valeur peut être représentée: int, long
int; si la valeur ne peut pas être
représentée comme un long int, la
comportement est indéfini. Si elle est octal
ou hexadécimal et n'a pas de suffixe, il
a le premier de ces types dans lesquels
sa valeur peut être représentée: int,
unsigned int, long int, unsigned long
int. Si elle est suffixé par u ou U, son
type est le premier de ces types de
dont la valeur peut être représentée:
unsigned int, unsigned long int. Si ça
est le suffixe l ou L, son type est le
premier de ces types dans lesquels sa
la valeur peut être représentée: long int,
unsigned long int. Si elle est suffixé
par ul, LU, uL, Lu, Ul, LU, UL, ou LU,
son type est unsigned long int p>
blockQuote> #define code> n'a pas de taille que ce n'est pas un type, mais une substitution de texte brut dans votre code C ++.
#define code> est une directive prétraiter et il fonctionne avant que votre code commence même à compiler. p>
L code> comme
102L code> puis on voit une longue, sinon sans suffixe, juste un int. Donc 4 octets sur x86 et x64 probablement, mais cela dépend compilateur. p>
Un entier ordinaire va être implicitement coulé à int code> dans tous les calculs et affectations. p>
#define code> indique simplement au préprocesseur de remplacer toutes les références à un symbole avec quelque chose d'autre. C'est la même chose que de faire une recherche globale à la suite de votre code et de remplacer
m_40 code> avec
40 code>. P>
+1 Global Trouver-remplacement est l'explication la plus rapide et la plus récente
une valeur dedefine n'a pas de taille, en particulier. C'est juste une substitution de texte. Cela dépend du contexte de l'endroit où (et de quoi) est substitué.
Dans votre exemple, où vous utilisez Cependant, si nous avions: p> Il sera traité comme longtemps. p> p> M_40 code>, la compile verra
40 code> et traitera habituellement c'est comme dans
int code>. p>
Pas généralement, toujours. Et la constante 40 code> sera toujours un
int code> dans votre code exemple. Cependant, la valeur
40 code> sera favorisée à un
long code> lors de l'appel de la fonction. Mais
40 code> La constante est toujours un
int code>.
@Gman: Pourquoi est-ce toujours un int même si cela pourrait être un simple four 1 octet? Edit (oui je sais que le char n'est pas nécessairement 1 octet)
@Gman: #define L (x) x ## l l (m_40) Maintenant c'est une longue. #define S (x) #x s (m_40) Maintenant c'est un char *, c'est pourquoi j'ai dit "généralement".
@Changeling: C'est à quel point la langue est définie, c'est au § 2.13 / 1 de la norme. Sans suffixe, le type de littéral sera un int code>; Si cela ne peut pas aller, ce sera un
long int code>. S'il ne peut pas entrer dans l'une ou l'autre de ceux-ci, le comportement est indéfini. De plus, un
char code> est toujours 1 octet. :) (un octet pourrait ne pas nécessairement être 8 octets, cependant. Généralement, les gens utilisent "Octect" pour faire référence à une collection de 8 octets.)
@Gmam: En outre, la promotion se produit ici à l'heure de la compilation, faisant la différence entre "AT promouvé à un long" et "être [ing] traité comme une longue" une zone très grise.
@James: 40 code> est un littéral qui a le type
int code>, toujours et pour toujours. Lorsque vous appelez la fonction, le paramètre sera initialisé en tant que
long (40) code>. Dans ce contexte,
40 code> est toujours un littéral avec le type
int code>. (Et l'ensemble de l'expression donne un
long code>, promu à partir d'une valeur
int code>.) Et en réponse à votre solution de macro alternative, c'est comme: "Est-ce une pomme?" "Oui" " gicle ça i> non ce n'est pas, c'est le jus de pomme!". Oui
40L code> n'est plus un
INT code> ... NOR IT IT
40 code> plus.
Le préprocesseur fait simplement une substitution de texte simple, donc le fait que votre constante est dans un #define code> n'a pas d'importance. Toute la norme C indique que "chaque constante doit avoir un type et la valeur d'une constante doit être dans la plage de valeurs représentables pour son type". C ++ est susceptible de ne pas trop varier de cela. P>
Aller plus loin, ce qui fait que C ++ mette la valeur dans un int code> au lieu de caractère lorsque 40 est une valeur acceptable, par exemple, de type non signé puisqu'il est compris entre 0 et 255?
@Changeling: basé sur les règles standard C ++.
Les macros de préprocesseur sont littéralement échangés pendant la phase de préprocession de la compilation.
Par exemple, le code P> sera échangé contre p> lorsque le compilateur le voit. Il n'a pas de taille propre comme tel p> p>
Qui dit un
court code> va être 2 octets ou un
int code> va être 4 octets? Ce sont les seules garanties que vous avez: Stackoverflow.com/Questtions/271076/...
@Gman: Bon lien .. Dans mon compilateur et mon environnement, il y a 2 octets afin que j'aurais dû clarifier .. merci
Cette question est étiquetée avec C ++, alors je suppose que c'est ce que vous programmez. Il n'y a aucune bonne raison d'utiliser
#define code> pour ce type de chose en C ++. Il suffit d'écrire
const int m_40 = 40; code> et être fait avec elle. Vous pouvez ensuite modifier le
int code> sur
court code> ou
char code> ou quoi que ce soit que vous aimez si vous vous souciez de la taille. En outre, il manque un peu le point de constantes nommées si le nom de la constante est juste sa valeur. Écriture
foo (m_40) code> n'est pas parfaitement plus clair que
foo (40) code>.
@Tyler: Eh bien, j'ai simplifié le contexte afin que m_40 signifie message 40 dans mon application particulière. Je suis d'accord sur la Constance cependant