Существует инфраструктура RPC, использующая hessian как стандартную сериализацию по умолчанию. Затем некоторым клиентам нужен протобуф. Чтобы быть совместимым с теми людьми, у которых нет протобуфа, мы помещаем все опоры protobuf в один файл и скомпилируем его условно в соответствии с текущей средой (имеют pb или нет).
. Структура имеет серию типов данных (Long, String, карта, и т.д.), каждый из них имеет сериалайзер отдельно, мы используем статическую-структуру зарегистрировать эти функции, она выглядит следующим образом:статическая структура и статическая глобальная переменная в C++
/*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' функцией статической, а не статической, чтобы гарантировать ее инициализацию при первом использовании. Или сделайте его подходящим синглтоном. –