gpt4 book ai didi

c++ - 如何将使用#ifdef编写的支持多种平台的代码移动到库函数中?

转载 作者:行者123 更新时间:2023-12-02 10:19:45 25 4
gpt4 key购买 nike

我们有一个支持多个平台(Windows,Linux和Mac)的C++项目。

为了支持多个平台,我们提供了以下代码段,以关闭所有平台的现有套接字。

#ifdef _WIN32
closesocket(m_nSocketHandle);
#elif __APPLE__
close(m_nSocketHandle);
#elif __linux__
shutdown(m_nSocketHandle,SHUT_RDWR);
#endif

同样,我们在其他操作系统上使用其他API,例如mkdir:
#ifdef _WIN32
if (0 == _mkdir(m_hStrDirectoryPath.c_str()))
#else
#ifdef __linux
char mkcmd[500];
sprintf(mkcmd, "mkdir -p %s", SDK_PATH);
system(mkcmd);
if (0 == mkdir(m_hStrDirectoryPath.c_str(), 0777))

#else
if (0 == mkdir(m_hStrDirectoryPath.c_str(), 0777))
#endif
#endif

除了在所有平台或操作系统上编写这样的代码之外,我们还可以通过在以下函数中使用以上代码来编写一个库(例如,commonlib):

例如
close_socket()
{
#ifdef _WIN32
closesocket(m_nSocketHandle);
#elif __APPLE__
close(m_nSocketHandle);
#elif __linux__
shutdown(m_nSocketHandle,SHUT_RDWR);
#endif
}

并从主应用程序调用此函数。这可能吗?

有人可以提供样本来理解这一点吗?

最佳答案

is this possible?



是的,这是可能的。

您所写的正是跨平台库的编写方式。

有些人更喜欢在函数定义中没有ifdefs。一种避免这种情况的方法是使用单独的转换单元在单独的系统上实现:
// win32.cpp
close_socket()
{
closesocket(m_nSocketHandle);
}

// apple.cpp
close_socket()
{
close(m_nSocketHandle);
}


// linux.cpp
close_socket()
{
shutdown(m_nSocketHandle,SHUT_RDWR);
}

然后选择要根据目标系统进行编译的源文件。模板或其他内联函数不能使用这种方法。方法之间的选择是主观的。

附言如果需要跨系统使用不同的状态表示形式,则可以使用PIMPL模式隐藏系统特定的数据。

关于c++ - 如何将使用#ifdef编写的支持多种平台的代码移动到库函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60710481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com