Я рефакторинг довольно большой кодовой базы. По старинке есть две библиотеки: 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
? Или это теперь должно быть глобальное проживание в заголовке? Или каково альтернативное решение?
Вы не можете ссылаться из другого файла на переменную, определенную в анонимном пространстве имен, подробнее здесь: анонимное пространство имен
Глобальные переменные не должны быть определены в общем заголовке. Чтобы позволить ссылаться из других файлов, достаточно, чтобы они были определены не в анонимном пространстве имен и не как статические.
Других решений пока нет …