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";
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";
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 *)
En su entorno sí, pero creo que el 'VARNAME' está definido en el código del OP. – moose
Incluso es peligroso ya que 'sizeof (int)' podría ser más pequeño que 'sizeof (char *)'. –
Esto podría funcionar perfectamente en su caja, pero almacenar un puntero en un 'int' tiene un comportamiento definido por la implementación. –
Encuentra la definición de "VARNAME" y verás. Diría algo así como "char *".
Lo GCC intenta hacer es:
VARNAME
con el tipo predeterminado, es decir int
;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
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 ... –
Solo por curiosidad, ¿dónde encontraste esta pequeña abominación? –