Я намерен обеспечить простые обертки для операционной системы API, которые бросают исключения, когда ошибки случаются. Эти обертки просты, и все они определяются как встроенные функции в заголовом файле. Поскольку System API должен быть большой, файл заголовка должен также быть огромным, содержащий большое количество крошечных встроенных функций. Проблема в том, что если общая библиотека (.so) скомпилирована с включенным файлом заголовка, все эти крошечные обертки будут скомпилированы в полученные двоичные двоичные, приводящие к большому двоичному файлу, даже когда только небольшая часть обертки на самом деле на самом деле использовал? Как насчет случая с исполняемыми файлами, это будет отличаться? Если это так, будет разделить обертки в несколько файлов заголовка, быть единственным решением? Или я должен сделать внутреннюю связь обертки, указав static
?
Вот что я думаю. Упаковы могут быть использованы ODR (например, принимая его адрес). А на платформах Linux функции с внешним соединением экспортируются по умолчанию (I.E., связываемая другими двоичными модулями). Поэтому, я думаю, это может быть необходимо для линкера на самом деле генерировать определения контуров для них. См. пункт 3) в разделе Описание здесь а>.
Простой пример, упаковка CloseHandle()
в Windows API:
inline void close_handle(HANDLE handle) {
if (!CloseHandle(handle)) {
throw std::system_error(GetLastError(), std::system_category(), "CloseHandle");
}
}
g++
, вероятно) не будут строить функции, если вы не просите их оптимизировать. - person Basile Starynkevitch   schedule 16.11.2015