uio.h和io.h有什么区别?

时间:2015-10-14 21:07:53

标签: c linux posix

有时我看到编译器抱怨这一行

#include <sys/io.h>

  

致命错误:sys / io.h:没有这样的文件或目录

如果我只是将其改为

#include <sys/uio.h>

它会神奇地起作用。有人可以向我解释一下这个区别吗?为什么有些操作系统有一个而不是另一个?

编辑:此问题发生在Linux上,而不仅仅是OS X.

1 个答案:

答案 0 :(得分:4)

一般来说,当编译器找不到该头时,简单地更改包含的头文件的名称是不安全的,甚至是不明智的。具有相似名称的标题不一定与彼此有任何关系。

这似乎就是这种情况:GLIBC头文件sys/io.h没有声明POSIX指定的头sys/uio.h的向量I / O函数,至少不直接。事实上,GLIBC还提供sys/uio.h。他们与众不同。 C和POSIX都没有任何理由相信一个系统上的sys/uio.h会提供由该{或1}}标头提供的任何声明。

如果您正在尝试构建C代码并且找不到某些标头,那么首先要考虑的是包含搜索路径,以及标头名称是否需要添加或删除路径段。接下来要考虑的是构建环境中是否需要该头。如果不是,那么更改标题以命名实际存在的其他标题将修复构建,但是完全删除sys/io.h指令也是如此。

我对它进行评分更好,实际上,要删除或注释掉这样一个失败的include指令,确保警告被激活,并查看编译器然后抱怨的遗漏声明是什么(如果有的话)关于。这将为您提供一个句柄,用于确定您应该包含哪个标题(如果有)代替丢失的标题。