Как сохранить постоянное определение в заголовочном файле и не связать его с каждой библиотекой? - PullRequest
1 голос
/ 29 июля 2010

Вот сценарий. Мы используем Visual C ++ 9. Есть библиотека C ++, предназначенная для использования многими другими библиотеками. Его интерфейс в шапке:

#pragma once

//CommonLibraryHeader.h
CSomeClass GetSomeClassFunction(); //is defined in some .cpp file
const CSomeClass MagicValue( 100, 200 ); //some predefined value that the previous function retuns to signify something important

теперь библиотека встроена в DLL-файл. Заголовочный файл публикуется в общем месте и включается в несколько других библиотек. Эти библиотеки встроены в их файлы .dll.

Чистый результат следующий. Поскольку каждый .dll является отдельным исполняемым модулем, он должен сохранять все эти константы. Каждая «константа» фактически является экземпляром класса с нетривиальным конструктором и деструктором. Теперь у каждого .dll есть копия MagicValue, и код для создания и уничтожения переменной внедряется в каждый файл .dll, который увеличивает время загрузки и значительно раздувает файлы .dll, если то же самое происходит для многих констант.

Возможное решение - пометить константу extern и переместить определение в файл .cpp. Но тогда значения констант, переданные в конструктор, не сразу видны читателю файла заголовка. Там можно добавить комментарий о значениях, но теперь, как обычно, нам бы хотелось синхронизировать комментарий с реальным кодом.

Есть ли лучшее решение - не перемещая константы из заголовка и не вставляя код строительства / разрушения в каждый файл .dll?

1 Ответ

2 голосов
/ 29 июля 2010

Вы можете использовать трюк, который часто используется с библиотеками DLL, которые экспортируют классы и функции: используйте #define, который определен только тогда, когда библиотека, в которую вы хотите включить код, встроена, но не определена в других, и выполните #if, который либо вызывает конструктор, либо определяет его как внешний, в зависимости от ситуации.

...