Vorrei chiedere se è possibile fare affidamento sull'indirizzo letterale stringa tra le unità di traduzione? Per esempio:Stringa Indirizzo letterale su unità di traduzione
Un dato file foo.c
ha un riferimento a una stringa letterale "I'm a literal!"
, è corretto e portatile per contare che in altre file specificato, bar.c
in esempio, che il stessa stringa letterale"I'm a literal!"
avranno la stessa memoria indirizzo? Considerando che ogni file verrà tradotto in un singolo file .o
.
Per una migliore illustrazione, segue un codice di esempio:
# File foo.c
/* ... */
const char * x = "I'm a literal!"
# File bar.c
/* ... */
const char * y = "I'm a literal!"
# File test.c
/* ... */
extern const char * x;
extern const char * y;
assert (x == y); //Is this assertion going to fail?
E un gcc righe di comando esempio:
gcc -c -o foo.o -Wall foo.c
gcc -c -o bar.o -Wall bar.c
gcc -c -o test.o -Wall test.c
gcc -o test foo.o bar.o test.o
Che dire nella stessa unità di traduzione? Questo sarebbe affidabile se i valori letterali delle stringhe sono nello stesso unità di traduzione?
No, non puoi fidarti di questo. –
@NeilKirk Grazie Neil, ho modificato e aggiunto una domanda secondaria. Qualsiasi logica alla base sarebbe di grande illuminazione. –
@fanl - La suite di compilatori Visual C++ ha un'opzione di "pooling di stringhe" in cui lo stesso letterale avrà lo stesso valore di puntatore. La parola chiave nell'ultima frase è * opzione *. Ciò implica che non è possibile fare affidamento sul fatto che i valori del puntatore sono uguali. – PaulMcKenzie