LINUX.ORG.RU

Глобальные объекты

 


0

2

Добрый день. Следующий факт мотивировал на создание темы:

//1.cpp
int val;

//2.cpp
extern int val;
class C
{
    int i;
public:
    C(): i{val} {}
}С;
Т.е. порядок инициализации объектов из разных модулей не определён и конструктор может увидеть непроинициализированную переменную. Я знаю про синглтоны, вопрос в другом: безопасно ли делать объекты из std глобальными, например, vector с заполняющим конструктором или использовать std функции в глобальных конструкторах? Можно ли контролировать порядок инициализации при подключении сторонней либы?

Если не ошибаюсь, видел какие-то штучки для задания порядка.

★★

безопасно ли делать объекты из std глобальными

Да.

например, vector с заполняющим конструктором

Да.

использовать std функции в глобальных конструкторах

Да.

контролировать порядок инициализации при подключении сторонней либы

Не очень понял что конкретно нужно, но есть лямбды.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

контролировать порядок инициализации при подключении сторонней либы

Нет. Глобальные переменные инициализируются в случайном порядке.

UVV ★★★★★
()
Ответ на: комментарий от mix_mix

Не очень понял что конкретно нужно

Т.е. написали свою либу, потом подключаем: g++ 1.cpp libmy.a

Мне кажется, что я где-то видел способ задавать порядок т.е. заставить проинициализироваться объекты из libmy.a до объектов из 1.cpp

pavlick ★★
() автор топика

Ведь как-то заставили cout быть проинициализированной перед использованием в gv.

pavlick ★★
() автор топика
Ответ на: комментарий от UVV

Не спорю, просто отложилось в памяти наличие возможности, а чья это фишка - нет.

pavlick ★★
() автор топика

Благодарю за ответы.

pavlick ★★
() автор топика

Ребят, всё-таки откуда уверенность что использование std функций в gv конструкторах допустимо? Если std в виде .so, то порядок вообще дело загрузчика, не путаю?. Читали где-то из стандарта или предположение?

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

Ребят, всё-таки откуда уверенность что использование std функций в gv конструкторах допустимо?

Ну, например, оттуда, что это, вроде-бы, специально никак не запрещено. А о каких конкретно функциях идет речь? Что-то про локаль?

Если std в виде .so, то порядок вообще дело загрузчика, не путаю?

Как реализовано std - дело std. Им никто не запрещает использовать всякие __attribute__ ((init_priority (101))) и прочие фокусы чтобы инициализировать свои глобальные переменные гарантированно до пользовательских.

asaw ★★★★★
()
Ответ на: комментарий от UVV

Конструкторы глобальных объектов. Речь о любых std функциях. Где гарантия, что где-то в libc.so и libstdc++.so нет чего-то вроде:

int any_data = 5;
int any_fn() {return any_data;}
Вызвал бы я any_fn() в конструкторе C (первое сообщение) и мог бы получить невалидное значение.

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

Ребят, всё-таки откуда уверенность что использование std функций в gv конструкторах допустимо?

нет такой уверенности. конкретно cout можно, но только в с++11.

anonymous
()
Ответ на: комментарий от pavlick

нету такой гарантии в спп. в аде что-то такое на уровне языка есть.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.