C ++ статический порядок инициализации

Пока мы работаем с версиями tomcat 6 и jdk 1.8, некоторые функции не будут работать, и эта ошибка вы получаете. вам нужно изменить версию jdk на стабильную версию (предпочтительный jdk 1.6 или jdk 1.8_65) в eclipse для устранения этой ошибки.

в eclipse шаг 1: свойства -> путь сборки Java -> jre системная библиотека ( удалить) Шаг 2: добавить -> jre system library -> alternate jre -> installed jre -> add -> Standard VM -> (in jre home, place jdk path) -> finish

теперь очистить и проверьте проект

58
задан Almo 17 November 2015 в 23:17
поделиться

4 ответа

Вы ответили на свой вопрос. Порядок статической инициализации не определен, и наиболее элегантный способ обойти его (выполняя статическую инициализацию, т.е. не реорганизуя ее полностью) - заключить инициализацию в функцию.

Прочтите элементы часто задаваемых вопросов C ++, начиная с https: //isocpp.org/wiki/faq/ctors#static-init-order

61
ответ дан 24 November 2019 в 16:52
поделиться

Возможно, вам стоит пересмотреть, нужно ли вам так много глобальных статических переменных. Хотя иногда они могут быть полезны, часто гораздо проще реорганизовать их в меньшую локальную область видимости, особенно если вы обнаружите, что некоторые статические переменные зависят от других.

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

7
ответ дан 24 November 2019 в 16:52
поделиться

Действительно, это работает. К сожалению, вы должны написать globalObject (). MemberFunction () вместо globalObject.MemberFunction (), в результате чего получится несколько запутанный и неэлегантный клиентский код.

Но самое главное, что он работает, и что это доказывает отказ , т.е. нелегко обойти правильное использование.

Правильность программы должна быть вашим первым приоритетом. Кроме того, IMHO, () выше чисто стилистический - т.е. совершенно неважно.

В зависимости от вашей платформы, будьте осторожны с слишком частой динамической инициализацией. Существует относительно небольшой объем очистки, который может иметь место для динамических инициализаторов (см. здесь ). Вы можете решить эту проблему, используя контейнер глобальных объектов, который содержит члены различных глобальных объектов. Таким образом, у вас есть:

Globals & getGlobals ()
{
  static Globals cache;
  return cache;
}

Есть только один вызов ~ Globals () для очистки всех глобальных объектов в вашей программе. Чтобы получить доступ к глобалу, у вас все еще есть что-то вроде:

getGlobals().configuration.memberFunction ();

Если вы действительно хотите, вы можете обернуть это в макрос, чтобы сэкономить немного времени при вводе с помощью макроса:

#define GLOBAL(X) getGlobals().#X
GLOBAL(object).memberFunction ();

Хотя это просто синтаксический сахар для вашего начального решение.

5
ответ дан 24 November 2019 в 16:52
поделиться

Большинство компиляторов (компоновщиков) действительно поддерживают (непереносимый) способ указания порядка. Например, в Visual Studio вы можете использовать прагму init_seg , чтобы разбить инициализацию на несколько разных групп. Насколько я знаю, нет возможности гарантировать порядок ВНУТРИ каждой группы. Поскольку это не переносится, вы можете подумать, можете ли вы исправить свой дизайн, чтобы он не требовался,

3
ответ дан 24 November 2019 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: