2012-02-22 14 views
5

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"; 
+0

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

+2

Solo per curiosità, dove hai incontrato questo piccolo abominio? –

risposta

6

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 *)

+0

Nel tuo ambiente si, ma credo che il 'VARNAME' sia definito nel codice dell'OP. – moose

+2

È anche pericoloso dato che 'sizeof (int)' potrebbe essere più piccolo di 'sizeof (char *)'. –

+0

Questo potrebbe funzionare perfettamente sulla tua scatola, ma la memorizzazione di un puntatore in un 'int' ha un comportamento definito dall'implementazione. –

0

Trova la definizione di "VARNAME" e vedrai. Direi qualcosa come "char *".

2

Cosa GCC cerca di fare è:

  1. Creare una costante VARNAME con il tipo predefinito, ovvero int;
  2. rendere questa costante 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