Inciampato su questa riga di codice c ma non era sicuro se è valido o meno. Che cosa fa? Che tipo avrà la variabile?Cosa fa questa riga di codice c? (const VAR = "stringa";)
const VARNAME = "String of text";
Inciampato su questa riga di codice c ma non era sicuro se è valido o meno. Che cosa fa? Che tipo avrà la variabile?Cosa fa questa riga di codice c? (const VAR = "stringa";)
const VARNAME = "String of text";
Stranamente, non mi aspettavo che questo si compilasse, ma lo fa. Tuttavia, il compilatore non piace troppo:
..\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
Quindi ci vuole int come tipo di default, e quindi VARNAME ha un valore di puntatore, dal momento che una stringa è un puntatore (che in seguito potrebbe essere lanciato come char *).
Questo funziona perfettamente (su una macchina Intel IA32):
#include<stdio.h>
const VARNAME = "String of text";
int main()
{
printf("%s\n", (char*)VARNAME);
return 0;
}
Ma io personalmente non sarebbe utilizzare tale tipizzazione implicita. Come spiegato sul commenti qui sotto:
è ancora pericoloso, in quanto sizeof (int) potrebbe essere inferiore sizeof (char *)
Nel tuo ambiente si, ma credo che il 'VARNAME' sia definito nel codice dell'OP. – moose
È anche pericoloso dato che 'sizeof (int)' potrebbe essere più piccolo di 'sizeof (char *)'. –
Questo potrebbe funzionare perfettamente sulla tua scatola, ma la memorizzazione di un puntatore in un 'int' ha un comportamento definito dall'implementazione. –
Trova la definizione di "VARNAME" e vedrai. Direi qualcosa come "char *".
Cosa GCC cerca di fare è:
VARNAME
con il tipo predefinito, ovvero int
;int
contenere un puntatore alla costante di carattere.Sulla mia macchina, non viene compilato, probabilmente perché int
è a 32 bit e i puntatori sono a 64 bit di larghezza.
a.c:1: error: initializer element is not computable at load time
Spero che questo [link1] (http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html), [link2] (http://www.tutorialspoint.com/ansi_c/c_using_constants .htm) ti aiuta ... –
Solo per curiosità, dove hai incontrato questo piccolo abominio? –