有时我看到编译器提示这一行
#include <sys/io.h>
与
fatal error: sys/io.h: No such file or directory
如果我简单地把它改成
#include <sys/uio.h>
它会神奇地起作用。有人可以向我解释其中的区别吗?为什么有些操作系统有一个而没有另一个?
编辑:这个问题发生在 Linux 上,而不仅仅是 OS X。
最佳答案
一般来说,当编译器找不到头文件时,简单地更改被包含的头文件的名称是不安全的,甚至是不明智的。具有相似名称的 header 之间不一定有任何关系。
这似乎是这里的情况:GLIBC 头文件 sys/io.h
没有声明 POSIX 指定的头文件 sys/uio.h 的 vector I/O 函数
,至少不是直接的。其实GLIBC也提供了sys/uio.h
。他们是不同的。 C 和 POSIX 都没有提供任何理由相信一个系统上的 sys/uio.h
会提供由名为 sys/io.h
的 header 提供的任何声明或任何其他系统。
如果您正在尝试构建 C 代码并且找不到某些 header ,那么首先要考虑的是包含搜索路径,以及 header 名称是否需要添加或删除路径段。接下来要考虑的是构建环境中是否完全需要该 header 。如果不是,则更改 header 以命名实际存在的其他 header 将修复构建,但同时删除 include
指令也是如此。
我会给它更好的评价,事实上,删除或注释掉这样一个失败的 include
指令,确保警告被启动,然后看看编译器遗漏了哪些声明(如果有的话)提示。这将为您提供一个句柄,用它来确定应该包含哪个 header (如果有)来代替缺失的 header 。
关于c - uio.h 和 io.h 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33135596/