代码之家  ›  专栏  ›  技术社区  ›  Engineer999

对于Linux和Windows,printf()等函数的实现方式是否不同

  •  2
  • Engineer999  · 技术社区  · 8 年前

    有些事我还不完全明白。例如,标准C函数 printf() scanf() 它处理将数据发送到标准输出或从标准输入获取数据。实现这些函数的源代码是否会因我们在Windows或Linux上使用它们而有所不同?

    我可能错了,但我的猜测是,实际的函数代码是相同的,但最终由这些函数调用的操作系统的底层函数是不同的。因此,任何编译器都可以编译这些相同的C函数,但它是在(这些函数依赖于什么才能在较低层上工作)之后链接的,是什么赋予了我们所需的行为?

    5 回复  |  直到 8 年前
        1
  •  1
  •   John Bollinger    8 年前

    实现这些功能的源代码会不同吗 这取决于我们是将它们用于Windows还是Linux?

    可能。它甚至可能在不同的linuxe和不同的Windows程序上有所不同。Linux上有几种不同的C标准库实现,Windows上可能不止一种。不同的实现将有不同的实现代码,否则律师会介入其中。

    操作系统的层函数,最终由这些层调用 功能不同。那么,任何编译器都可以编译相同的C语言吗 依赖于工作在较低的层)是什么给了我们所需的 行为?

    然而,实际上,您不太可能看到您所描述的Windows和Linux的情况。

        2
  •  0
  •   StaceyGirl    8 年前

    是的,它们有不同的实现。

    此外,您可能在同一操作系统上使用多个不同的实现。例如:

    • MinGW附带了自己的标准库实现,这与MSVC使用的标准库不同。
    • glibc , musl , dietlibc 和其他人。

    显然,这意味着社区中存在一些代码重复,但有很多很好的理由:

    • 许可证:实现对如何使用它们施加了一些限制,并且可能需要最终用户执行一些操作(在某些情况下,GPL要求您共享代码)。不是每个人都能遵循这些要求。
    • 人们有非常不同的需求。有些环境是多线程的,有些则不是。 printf 可能需要或不需要使用某些线程同步机制。有些人需要语言环境支持,有些人不需要。所有这些最终会使代码膨胀,不是每个人都愿意为他们不使用的东西付费。甚至 strerror vastly different on different OSes
    • 上述同步机制通常是特定于操作系统的,并且以特定的方式工作。同样地,语言环境处理、信号处理和其他事情,包括实际的数据写入和读取也是如此。
    • 一些实现添加了非标准扩展,可以让您的生活更轻松。并非所有这些在其他操作系统上都有意义。例如,glibc补充道 'e' 打开文件的模式说明符 O_CLOEXEC 旗帜。这对Windows没有意义。
    • 许多复杂的事情不能用纯C实现,需要一些编译器特定的扩展。这可以将实现绑定到数量有限的编译器。

        3
  •  0
  •   Samuel Peter    8 年前

    正如您所说的,printf之类的实现的更高级别部分,比如使用参数格式化字符串的代码,可以以跨平台的方式编写,并在Linux和Windows之间共享。我不确定是否有一个C库真正做到了这一点。

    system calls Linux Windows .

        4
  •  0
  •   bazza    8 年前

    像printf()这样的函数有两个部分。第一部分解析格式字符串,并组装一个准备输出的字符数组。如果这部分是用C编写的,那么没有理由阻止它在所有C库中通用,也没有理由阻止它不同,只要printf()的标准定义实现了。碰巧的是,不同的库开发人员已经阅读了printf()的标准定义,并且想出了不同的解析和处理格式字符串的方法。 他们中的大多数人这样做是正确的。

    第二部分,将这些字符输出到stdout的位,是差异所在。它依赖于使用内核系统调用接口;内核/操作系统负责处理输入/输出,这是以特定的方式完成的。让Linux内核输出字符所需的源代码与让Windows输出字符所需的源代码非常不同。

    也没有理由让包含printf()的库用C编写。只要遵守C编译器使用的相同函数调用约定,就可以用汇编语言编写它(尽管这有点疯狂!)。或者Ada(调用约定可能有点棘手……)。

        5
  •  0
  •   chux    8 年前

    实现这些功能的源代码会不同吗

    让我们尝试另一种观点:竞争。

    不需要。C规范并不要求行业内的竞争对手共享源代码来发布兼容的编译器,不同的标准C库开发人员也不总是希望这样。

    C不需要“开源”。