Si consideri il seguente codice:Una funzione inline in un file di intestazione può utilizzare una costante con collegamento interno?
const int a = 0;
const std::string b = "hi";
inline void f_a1()
{
std::cout << a;
}
inline void f_b1()
{
std::cout << b;
}
inline void f_a2()
{
std::cout << &a;
}
inline void f_b2()
{
std::cout << &b;
}
Assumere esiste questo codice in un file di intestazione che sarà incluso in più unità di traduzione.
La mia comprensione delle funzioni inline è che devono essere esattamente uguali in ogni unità di traduzione.
La mia comprensione delle costanti come sopra utilizzata, è che sono implicitamente static
cioè collegamento interno. Ciò significa che ciascuna unità di traduzione ottiene la propria copia.
Poiché le funzioni inline sopra si basano su queste costanti, quali di queste funzioni, se presenti, sono corrette?
'f_a1' e' f_b1' sono corretti, perché si riferiscono al valore di una costante. Anche se il compilatore crea più di una costante, avranno tutti lo stesso valore. Quindi, anche se occorrenze diverse delle funzioni utilizzano costanti reali differenti, non infrangerà le aspettative per il codice (btw, la maggior parte del compilatore piegherà la costante 'int' direttamente nel codice generato, quindi non ci sarà un vero' a' costante nel tuo programma). Sto pensando agli altri due. –
@GiulioFranco perché 'f_a2' pr' f_b2' non sarebbe corretto? –
@LuchianGrigore Non ho detto che lo sono. Ci sto pensando.Se le costanti sono realmente collegate staticamente (cosa di cui non sono sicuro), il compilatore potrebbe avere diverse istanze di esse, che avranno indirizzi diversi, a meno che il linker non sia in grado di unificare le diverse definizioni (che dovrebbe essere il caso). –