我打算为操作系统 API 提供简单的包装器,当错误发生时会抛出异常。这些包装器很简单,并且都被定义为头文件中的内联函数。由于系统 API 应该很大,因此头文件也应该很大,包含大量微小的内联函数。问题是,如果在包含头文件的情况下编译共享库(.so),所有这些微小的包装器会被编译成生成的二进制文件,从而导致一个大的二进制文件,即使实际上只有一小部分包装器是用过的?可执行文件的情况如何,会有所不同吗?如果是这种情况,将包装器拆分为多个头文件是唯一的解决方案吗?或者我应该通过指定使包装器内部链接static
?
这是我的想法。包装器可以被 ODR 使用(例如,获取其地址)。而在Linux 平台上,默认导出具有外部链接的函数(即可以被其他二进制模块链接)。所以我想链接器可能有必要为它们实际生成大纲定义。请参阅此处描述部分中的要点 3) 。
包装CloseHandle()
在 Windows API 中的简单示例:
inline void close_handle(HANDLE handle) {
if (!CloseHandle(handle)) {
throw std::system_error(GetLastError(), std::system_category(), "CloseHandle");
}
}