C++ 在您正在构建的跨平台库中进行操作系统API调用,您建议采用什么方法?

C++ 在您正在构建的跨平台库中进行操作系统API调用,您建议采用什么方法?,c++,c,C++,C,让我进一步解释。。 是否建议使用,例如: \ifdef\u WIN32 void函数() { //进行windows API调用的函数的windows版本 } #已定义的elif(_linux__;) void函数() { //进行POSIX调用的函数的linux版本 } #恩迪夫 或者为每个操作系统创建单独的源代码文件,然后在makefiles或任何构建工具中使用条件代码根据操作系统编译源代码 首先,“最佳”在某种程度上是基于意见的,可能会让这个问题结束。然而,我的观点是,您应该从一个角度出

让我进一步解释。。 是否建议使用,例如:

\ifdef\u WIN32
void函数()
{
//进行windows API调用的函数的windows版本
}
#已定义的elif(_linux__;)
void函数()
{
//进行POSIX调用的函数的linux版本
}
#恩迪夫
或者为每个操作系统创建单独的源代码文件,然后在makefiles或任何构建工具中使用条件代码根据操作系统编译源代码

首先,“最佳”在某种程度上是基于意见的,可能会让这个问题结束。然而,我的观点是,您应该从一个角度出发,即有一组PO操作S系统I接口(+X),这些就是您编写代码的目的。然后,对于缺少部分或全部可移植接口的系统,您可以在特定古怪操作系统希望您使用的任何特定于操作系统的接口之上提供内置替换实现

这允许您将复杂条件和特定于操作系统的逻辑排除在实际程序逻辑之外,并将其作为平台支持隔离。有些人喜欢通过构建自己的可移植层(APR、NSPR等)来实现这一点,并将POSIX作为后端处理。我强烈建议不要这样做,因为:

  • 它给已经有便携接口的系统带来了很大的开销
  • 这使得熟悉标准接口但不熟悉您自己的可移植性层的人很难阅读您的代码
  • 这使得代码很难在移植层不适合的项目中重用
  • 这是一个巨大的牦牛剃须的兔子洞,它会让你陷入困境,把你所有的时间都从你真正想要的代码中抽走

  • 人们并没有明确的正确答案。您提到的两种方法都是常用的。自由运用你的判断,自己决定。这两种方法的优缺点是什么?我见过使用这两种变体的项目。根据具体的地点,他们决定使用哪种变体。这是一个很好的答案,尽管从技术上讲我不同意。无论如何,它提供了另一种替代方法:不要编写自己的操作系统特定抽象,而是使用现有的抽象,例如提到的Apache Portable Runtime(APR)。@UlrichEckhardt:确实是一种选择,但实际上阅读源代码是我创建bullet point 1的动机。有一次,我发现svn打印消息的代码路径出现了一个问题,它需要经历4层“可移植运行时”的东西,这相当于一个可移植的
    printf
    调用。(最终的问题是,无论它当时在这些层中做什么,实际上都不是可移植的。)