Si un valor se define comoTamaño de #define valora
#define M_40 40
es el tamaño de la misma como un short
(2 bytes) o se trata como un (byte 1) char
o int
(4 bytes)?
¿El tamaño depende de si tiene 32 bits o 64 bits?
Si un valor se define comoTamaño de #define valora
#define M_40 40
es el tamaño de la misma como un short
(2 bytes) o se trata como un (byte 1) char
o int
(4 bytes)?
¿El tamaño depende de si tiene 32 bits o 64 bits?
#define
no tiene ningún tamaño, ya que no es un tipo sino una sustitución de texto sin formato en su código C++. #define
es una directiva de preproceso y se ejecuta antes de que el código comience a compilarse.
El tamaño en código C++ después de la sustitución es el que sea el tamaño de la expresión o código C++ que tenga allí. Por ejemplo, si sufijo con L
como 102L
, se verá largo, de lo contrario, sin sufijo, solo un int. Entonces 4 bytes en x86 y x64 probablemente, pero esto depende del compilador.
Quizás sección literal entero del C++ estándar aclararlo para usted (Sección 2.13.1-2 del estándar C++ 03):
El tipo de un literal entero depende de su forma , valor y sufijo. Si es decimal y no tiene sufijo, tiene el primero de estos tipos en que se puede representar su valor : int, long int; si el valor no puede ser representado como un int largo, el comportamiento no está definido. Si es octal o hexadecimal y no tiene sufijo, tiene el primero de estos tipos en que se puede representar su valor: int, unsigned int, long int, unsigned long int. Si tiene el sufijo u o U, su tipo es el primero de estos tipos en cuyo valor se puede representar: unsigned int, unsigned long int. Si tiene el sufijo l o L, su tipo es , el primero de estos tipos en que se puede representar su valor : long int, unsigned long int. Si se añade como sufijo por UL, Lu, UL, Lu, Ul, Lu, UL, o LU, su tipo es unsigned long int
Ojalá pudiera +1 una vez más para la cotización estándar, muy útil. – GManNickG
un entero normal va a ser echado implícitamente a int
en todos los cálculos y asignaciones.
#define
simplemente le dice al preprocesador que reemplace todas las referencias a un símbolo por otra cosa. Esto es lo mismo que hacer un reemplazo de búsqueda global en su código y reemplazar M_40
con 40
.
+1 Global Find-Replace es la explicación más clara, fácil de usar para principiantes –
Un valor #define no tiene ningún tamaño, específicamente. Es solo una sustitución de texto. Depende del contexto de dónde (y qué) está siendo sustituido.
En su ejemplo, donde usa M_40
, la compilación verá 40
, y generalmente la trata como int
.
Sin embargo, si tuviéramos:
void SomeFunc(long);
SomeFunc(M_40);
será tratado como mucho.
No siempre, siempre. Y el constante '40' seguirá siendo un' int' en su código de ejemplo. Sin embargo, el valor '40' se promocionará a' largo' al llamar a la función. Pero '40' la constante sigue siendo un' int'. – GManNickG
@GMan: ¿Por qué sigue siendo un int a pesar de que podría ser un simple char de 1 byte? Editar (Sí, sé que el carácter no es necesariamente de 1 byte) –
@GMan: #define L (X) X ## L L (M_40) ahora es un largo. #define S (X) #X S (M_40) ahora es un char *, por lo que dije "generalmente". –
El preprocesador simplemente realiza la sustitución de texto simple, por lo que no importa el hecho de que su constante esté en un #define
. Todo el estándar C dice que "cada constante tendrá un tipo y el valor de una constante estará en el rango de valores representables para su tipo". Es probable que C++ no varíe mucho de eso.
Yendo más lejos, ¿qué hace que C++ arroje el valor en un 'int' en lugar de char cuando 40 es un valor aceptable, por ejemplo, char sin signo, ya que está entre 0 y 255? –
@Changeling: Basado en las reglas estándar de C++. –
Las macros de preprocesador se intercambian literalmente durante la etapa de preproceso de la compilación.
Por ejemplo el código
#define N 5
int value = N;
obtendrá cambiado por
int value = 5;
cuando el compilador ve. No tiene un tamaño propio como tal
¿Quién dice que un 'short' va a ser de 2 bytes o un' int' va a ser de 4 bytes? Estas son las únicas garantías que tiene: http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c/271132#271132 – GManNickG
@GMan : Buen enlace ... En mi compilador y entorno, son 2 bytes, así que debería haberlo aclarado ... gracias –
Esta pregunta está etiquetada con C++, así que supongo que esa es tu programación. No hay una buena razón para usar '# define' para este tipo de cosas en C++. Simplemente escriba 'const int M_40 = 40;' y termine con esto. A continuación, puede cambiar 'int' por' short' o 'char' o lo que quiera si le interesa el tamaño. Además, está perdiendo el punto de las constantes con nombre si el nombre de la constante es solo su valor. Escribir 'foo (M_40)' no es exactamente más claro en su significado que 'foo (40)'. –