Локальные static/thread_local переменные встроенных функций?
Если у меня есть статическая локальная переменная или локальная переменная thread_local, которая находится внутри встроенной функции, которая определена в разных единицах перевода, в конечной программе они гарантируются стандартом, чтобы иметь один и тот же адрес?
// 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; }
Будет ли вышеперечисленное всегда возвращать 1?
Ответы
Ответ 1
Да, это всегда один и тот же объект. По [dcl.fct.spec]/4:
Функция inline
с внешней связью должна иметь один и тот же адрес во всех единицах трансляции. Локальная переменная static
в функции extern inline
всегда относится к одному и тому же объекту. Тип, определенный внутри тела функции extern inline
, является одним и тем же типом в каждой единицы перевода.