Я намерен предоставить простые обертки API операционной системы, которые генерируют исключения при возникновении ошибок. Эти обертки просты и все они определены как встроенные функции в файле заголовка. Поскольку системный API должен быть большим, файл заголовка также должен быть огромным, содержащим большое количество мелких встроенных функций. Проблема состоит в том, что если совместно используемая библиотека (.so) скомпилирована с включенным файлом заголовка, все эти крошечные обертки будут скомпилированы в результирующий двоичный файл, что приведет к большому двоичному файлу, даже если на самом деле будет только небольшая часть оберток используемый? Что относительно случая с исполняемыми файлами, будет ли это иначе? Если это так, разделение оберток на несколько файлов заголовков будет единственным решением? Или я должен сделать внутреннюю привязку оберток, указав static
?Встроенная функция компиляции
Вот что я думаю. Обертки могут быть использованы в ODR (например, для его адреса). На платформах Linux функции с внешней связью экспортируются по умолчанию (т. Е. Связаны с другими двоичными модулями). Поэтому, я думаю, может быть необходимым, чтобы компоновщик фактически генерировал для них общие определения. См. Пункт 3 маркировки) в Описание раздел here.
Простой пример упаковки CloseHandle()
в Windows API:
inline void close_handle(HANDLE handle) {
if (!CloseHandle(handle)) {
throw std::system_error(GetLastError(), std::system_category(), "CloseHandle");
}
}
Я чувствую, что ваш вопрос слишком широк (вы не показываете какой-либо код), неясно, и вы слишком много заботитесь о неявных деталях (вы не сказали, что), что реализация на практике справляется достаточно хорошо. Сначала сначала создайте часть своей библиотеки, а затем задайте более целенаправленные вопросы с помощью некоторого фактического исходного кода. Конкретнее: какая ОС, какой компилятор, какие флаги компиляции, какой исходный код? –
@BasileStarynkevitch Возможно, вы правы. Но то, что я хочу, - это (почти) прототипное решение на уровне исходного кода. Таким образом, параметры опций ОС, компилятора и компилятора не должны иметь значения. Я добавлю простой примерный код. – Lingxi
Параметры компилятора * имеют значение *, поскольку некоторые компиляторы ('g ++' вероятно) не будут встроены в функции, если вы не попросите их оптимизировать. –