статическая структура и статическая глобальная переменная в c ++

0

Существует инфраструктура RPC, использующая hessian как стандартную сериализацию. Затем некоторым клиентам нужен протобуф. Чтобы быть совместимым с теми людьми, у которых нет протобуфа, мы помещаем все опоры protobuf в один файл и компилируем его условно в соответствии с текущей средой (имеют pb или нет)
Структура имеет серию типов данных (Long, String, Map и т.д.), Каждый из которых имеет сериализатор отдельно, мы используем статическую структуру для регистрации этих функций, она выглядит так:

/*file register.cc */

В файле поддержки protobuf мы делаем аналогичные вещи:

/* pb_support.cc */

два файла выходят в разных каталогах:
В gcc 4.1.2 с Redhat5.6 он работает хорошо. В gcc 4.8 с Ubuntu 13.04, когда protobuf включен, pb_object_install всегда выдает первый результат, но результат равен нулю, это означает, что результат регистрации pb был уничтожен, поэтому протокол protobuf бесполезен.
Почему это? и есть ли какая-либо замена для выполнения той же функции?

  • 2
    Статический порядок инициализации не указан. Два файлово-статических объекта в двух разных файлах просто не могут ссылаться друг на друга. Вы должны сделать serializer_registry функционально-статическим вместо file-static, чтобы гарантировать, что он инициализируется при первом использовании. Или сделайте его подходящим синглтоном.
Теги:

1 ответ

3

Инициализация переменных в глобальном пространстве имен находится в порядке объявления в одной единице перевода. Однако порядок инициализации между единицами перевода не указан.

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

  • 0
    если сначала выполняется pb-часть, почему массив serializer_registry все еще пуст, когда речь идет о гессианской части? две инициализации оправданы одна за другой?
  • 2
    В программе есть UB. Исправьте это и не спрашивайте, почему UB проявляется именно таким образом. Такие вопросы непродуктивны. (Хотя легко увидеть, что часть pb незаконно записывает в реестр до вызова его конструктора, затем вызывается конструктор, стирая все, что было написано).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню