2015-08-23 15 views
11

Se ho una variabile locale statica o una variabile locale thread_local che si trova all'interno di una funzione inline definita in diverse unità di traduzione, nel programma finale sono garantiti dallo standard che hanno lo stesso indirizzo?Variabili locali static/thread_local delle funzioni inline?

// TU1: 
inline int* f() { static int x; return &x; } 
extern int* a; 
void sa() { a = f(); } 

// TU2: 
inline int* f() { static int x; return &x; } 
extern int* b; 
void sb() { b = f(); } 

// TU3: 
int *a, *b; 
void sa(); 
void sb(); 
int main() { sa(); sb(); return a == b; } 

Quanto sopra restituisce sempre 1?

risposta

9

Sì, è sempre lo stesso oggetto. Con [dcl.fct.spec]/4:

Una funzione inline con collegamento esterno deve avere lo stesso indirizzo in tutte le unità di traduzione. Una variabile locale static in una funzione extern inline fa sempre riferimento allo stesso oggetto. Un tipo definito all'interno del corpo di una funzione extern inline è lo stesso tipo in ogni unità di traduzione.

+0

Grazie, e suppongo che il caso 'thread_local' abbia una risposta simile? –

+0

@AndrewTomazos: Sì, penso di sì, perché con [dcl.stc]/4, l'identificatore 'thread_local' implica l'identificatore' static', e la regola che ho citato nella risposta si applica allo * specificatore *, non all'archiviazione classe. –

Problemi correlati