Может ли extern решить эту проблему или каким-то другим способом я могу обойти это?

Я рефакторинг довольно большой кодовой базы. По старинке есть две библиотеки: FooFactory а также BarLib, BarLib зависит от FooFactory что в свою очередь зависит от многих Foo1, Foo2, Foo3 код и т. д. … когда построено, FooFactory тянет во все Foo зависимости, а затем BarLib можешь использовать FooFactory запросить строительство, скажем, Foo7, В моем рефакторинге я делаю все FooX ребята зависят от FooFactory (а не наоборот), и зарегистрируйте себя статически, если make-файл связывает их. BarLib все еще зависит от FooFactory но удастся только создать Foo7 если он был связан и таким образом зарегистрирован статически в FooFactory,

Я сталкиваюсь со следующей проблемой:

Есть специальный Foo14, который основной заводской файл FooFactory.C в FooFactory строит со строкой, которая BarLib наборы. Это работает так, что FooFactory.H выставляет глобальную функцию под названием setString(const std::string&); и в .C файл имеет std::string theString переменная в анонимном пространстве имен. Затем метод в BarLib может или не может использовать эту функцию, чтобы установить эту строку. И в корпусе FooFactory.Cэта строка проверяется во время построения Foo14,

Проблема в том, что при обращенной зависимости весь строительный код для Foo Парни хранятся в своих библиотеках и вызываются только в том случае, если они статически зарегистрированы. У меня нет простого способа передать это std::string до Foo14 потому что он придерживается общего интерфейса аргументов, переданных для создания Foo, Если я помещу строку theString в Foo14.C тогда это заставит BarLib зависит от Foo14 для того, чтобы установить это … так что мне было интересно, смогу ли я сохранить его в FooFactory.C, но в Foo14 объявите это как внешний и используйте это. Будет ли это работать, даже если theString находится в анонимном пространстве имен FooFactory.C? Или это теперь должно быть глобальное проживание в заголовке? Или каково альтернативное решение?

0

Решение

Вы не можете ссылаться из другого файла на переменную, определенную в анонимном пространстве имен, подробнее здесь: анонимное пространство имен

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector