【发布时间】:2018-12-21 04:24:06
【问题描述】:
我还没有完全理解的东西。例如,标准 C 函数,如 printf() 和 scanf(),它们处理将数据发送到标准输出或从标准输入获取数据。实现这些功能的源代码是否会因我们是在 Windows 还是 Linux 上使用而有所不同?
我猜快速回答是“是”,但它们真的必须不同吗?
我可能是错的,但我的猜测是实际的函数代码是相同的,但最终被这些函数调用的操作系统的底层函数是不同的。所以任何编译器都可以编译这些相同的 C 函数,但它是链接之后的(这些函数依赖于在较低层上工作)是什么给了我们所需的行为?
【问题讨论】:
-
为什么要强制它们相同?
-
库函数只需要执行符合标准,无论如何实现。
-
操作系统有很多不同,因此实现C标准的函数的编写方式也有很多不同。对于
printf()等 I/O 函数,您需要担心与代码集和语言环境相关的问题,例如,它们在 Windows 和 Unix 上的处理方式不同。 -
printf 中通常没有操作系统依赖项,因此它可以可移植地实现——如果有一个可移植的
FILE *和其他 stdio 基础设施来实现它的条款,没有。 (虽然理论上你可以用putchar编写一个 100% 可移植的printf。)但是往往会有其他平台依赖关系潜入printf,比如使用%p打印指针的适合平台的方式,以及任何平台扩展或限制。 (往往有很多。微软已经对printf进行了很多修改,FSF 也有。)