Существует инфраструктура 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 бесполезен.
Почему это? и есть ли какая-либо замена для выполнения той же функции?
Инициализация переменных в глобальном пространстве имен находится в порядке объявления в одной единице перевода. Однако порядок инициализации между единицами перевода не указан.
Это означает, что если у вас есть два исходных файла, вы не можете сказать, какие файлы будут инициализированы сначала. Это, конечно, вызовет проблемы, если переменная в одном исходном файле зависит от переменной в другом исходном файле, который сначала инициализируется.
serializer_registry
функционально-статическим вместо file-static, чтобы гарантировать, что он инициализируется при первом использовании. Или сделайте его подходящим синглтоном.