2012-02-22 18 views
5

Tropezó con esta fila de código c pero no estaba seguro de si es válida o no. ¿Qué hace? ¿Qué tipo tendrá la variable?¿Qué hace esta fila del código c? (const VAR = "cadena";)

const VARNAME = "String of text"; 
+0

Hope esta [Link1] (http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html), [link2] (http://www.tutorialspoint.com/ansi_c/c_using_constants .htm) te ayuda ... –

+2

Solo por curiosidad, ¿dónde encontraste esta pequeña abominación? –

Respuesta

6

Curiosamente, no esperaba que compilara, pero lo hace. Sin embargo, el compilador no le gusta demasiado:

..\main.c:4:7: warning: type defaults to 'int' in declaration of 'VARNAME' 
..\main.c:4:17: warning: initialization makes integer from pointer without a cast 

para que no tome int como tipo predeterminado, y por lo tanto VARIABLE tiene un valor de puntero, ya que una cadena es un puntero (que más tarde podría ser elegida como char *).

Esto funciona perfectamente (en una máquina Intel IA32):

#include<stdio.h> 

const VARNAME = "String of text"; 

int main() 
{ 
    printf("%s\n", (char*)VARNAME); 
    return 0; 
} 

Pero yo personalmente no usaría tales tipos implícitos. Como se explica en los comentarios a continuación:

es incluso peligroso, ya que sizeof (int) podría ser menor que sizeof (char *)

+0

En su entorno sí, pero creo que el 'VARNAME' está definido en el código del OP. – moose

+2

Incluso es peligroso ya que 'sizeof (int)' podría ser más pequeño que 'sizeof (char *)'. –

+0

Esto podría funcionar perfectamente en su caja, pero almacenar un puntero en un 'int' tiene un comportamiento definido por la implementación. –

0

Encuentra la definición de "VARNAME" y verás. Diría algo así como "char *".

2

Lo GCC intenta hacer es:

  1. Realice una constante VARNAME con el tipo predeterminado, es decir int;
  2. hacen que esta constante int contenga un puntero a la constante de caracteres.

En mi máquina, no se compila, probablemente porque int es de 32 bits y los punteros tienen 64 bits de ancho.

a.c:1: error: initializer element is not computable at load time