Концептуально, единица компиляции (единица кода в исходном файле / объектном файле) либо полностью связана, либо не связана вообще.Хотя некоторые реализации со значительным уровнем взаимодействия между компилятором и компоновщиком способны удалять неиспользуемый код из объектных файлов во время компоновки, это не меняет проблему, включающую 2 модуля компиляции с конфликтующими именами символовв программе есть ошибка.
В качестве практического примера, предположим, что ваша библиотека имеет две функции foo
и bar
, и они находятся в объектном файле вместе.Если я хочу использовать bar
, но в моей программе уже есть внешний символ с именем foo
, я застрял с ошибкой.Даже если или как реализация могла бы решить эту проблему для меня, код все еще неверен.
С другой стороны, если у меня есть библиотечный файл, содержащий два отдельных объектных файла, один с foo
а с другим с bar
, только та, которая содержит bar
, будет извлечена в мою программу.
При написании библиотек вы должны избегать включения нескольких функций в один и тот же объектный файл, если только не требуется, чтобы они использовалисьвсе вместе.Это приведет к разложению приложений, которые связывают вашу библиотеку (статически), и увеличит вероятность конфликтов символов.Лично я предпочитаю ошибаться на стороне отдельных файлов, когда есть сомнение - даже полезно поместить foo_create
и foo_free
в отдельные файлы, если последний нетривиален, так что короткие одноразовые программы, которые не нужно вызывать foo_free
может избежать вытягивания кода для глубокого освобождения (и, возможно, даже избежать вытягивания в реализации самой free
).