2010-07-07 21 views
10

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?

+0

¿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

+0

@GMan : Buen enlace ... En mi compilador y entorno, son 2 bytes, así que debería haberlo aclarado ... gracias –

+4

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

Respuesta

28

#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

+1

Ojalá pudiera +1 una vez más para la cotización estándar, muy útil. – GManNickG

7

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.

+0

+1 Global Find-Replace es la explicación más clara, fácil de usar para principiantes –

2

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.

+1

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

+0

@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) –

+0

@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". –

1

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.

+0

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? –

+3

@Changeling: Basado en las reglas estándar de C++. –

2

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

Cuestiones relacionadas