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

3
有时候我会看到编译器抱怨这一行。
#include <sys/io.h>

使用以下方法修改代码:

致命错误:sys / io.h:没有那个文件或目录

如果我只是改变它为:

#include <sys/uio.h>

它会像魔法一样工作。有人能解释一下其中的区别吗?为什么有些操作系统有一个但没有另一个?

编辑: 这个问题不仅发生在OS X上,也发生在Linux上。


3
<sys/io.h>是一个头文件,用于在C语言中访问底层输入输出(I/O)操作。它包含了一些函数和常量,例如读写端口、内存映射I/O等。如果你需要进行底层I/O编程,就需要包含这个头文件。 - melpomene
2
@melpomene 这是一个 POSIX 库的头文件,或者是一个被广泛支持的 Unix 头文件。我不太确定是哪个。从外表看,William,欢迎来到 Mac 世界。他们那里有点奇怪。无论如何,这几乎是一个重复的问题:https://dev59.com/D03Sa4cB1Zd3GeqPwJL5 - user4581301
<sys/uio.h>来自POSIX:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_uio.h.html - alk
2
当你注释掉 #include <sys/io.h> 后,你的代码甚至无法编译吗? - alk
@alk 那么使用<sys/uio.h>来实现可移植性不是更好吗?有<sys/io.h>会带来什么好处呢? - Fermat's Little Student
显示剩余2条评论
1个回答

4
一般而言,在编译器找不到头文件时,仅更改正在包含的头文件的名称是不安全的,甚至是不明智的。名称相似的头文件并不一定有任何关联。
在这里似乎就是这种情况:GLIBC的头文件sys/io.h并没有直接声明POSIX规定的头文件sys/uio.h中的向量I/O函数。事实上,GLIBC也提供sys/uio.h。它们是不同的。C语言和POSIX都没有任何理由相信一个系统上的sys/uio.h会提供任何被称为sys/io.h的头文件所提供的声明,无论是在该系统还是在其他系统上。
如果您在尝试构建C代码时某个头文件无法找到,则首先要考虑的是包含搜索路径,以及是否需要添加或删除路径段。接下来要考虑的是,在构建环境中是否真的需要该头文件。如果不需要,那么将该头文件更改为实际存在的其他头文件的名称将修复构建问题,但删除include指令也可以解决问题。
实际上,我认为最好是删除或注释掉此类失败的include指令,确保警告被放大,并查看编译器是否会抱怨缺少哪些声明。这将为您提供一个处理缺失的头文件时需要包含哪个头文件的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接