2015-08-23 11 views
11

Wenn ich eine statische lokale Variable oder lokale Variable thread_local innerhalb einer Inline-Funktion habe, die in verschiedenen Übersetzungseinheiten definiert ist, wird im endgültigen Programm garantiert, dass der Standard die gleiche Adresse hat?Lokale statische/thread_local Variablen von Inline-Funktionen?

// 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; } 

Wird oben immer 1 zurückgegeben?

Antwort

9

Ja, es ist immer das gleiche Objekt. Nach [dcl.fct.spec]/4:

Eine inline Funktion mit externer Verbindung muss in allen Übersetzungseinheiten die gleiche Adresse haben. Eine static lokale Variable in einer extern inline Funktion bezieht sich immer auf das gleiche Objekt. Ein im Rumpf einer extern inline-Funktion definierter Typ ist in jeder Übersetzungseinheit derselbe Typ.

+0

Danke, und ich denke, der 'thread_local' Fall hat eine ähnliche Antwort? –

+0

@AndrewTomazos: Ja, ich denke schon, weil durch [dcl.stc]/4 der 'thread_local'-Spezifizierer den' statischen' Spezifizierer impliziert, und die Regel, die ich in der Antwort anführte, gilt für den * Spezifizierer *, nicht für den Speicher Klasse. –