C uio.h和io.h之间有什么区别?

C uio.h和io.h之间有什么区别?,c,linux,posix,C,Linux,Posix,有时我看到编译器抱怨这行代码 #include <sys/io.h> #包括 与 致命错误:sys/io.h:没有这样的文件或目录 如果我把它改成 #include <sys/uio.h> #包括 它会神奇地工作。有人能给我解释一下区别吗?为什么有些操作系统有一个而没有另一个 编辑:这个问题发生在Linux上,而不仅仅是在OS X上。一般来说,当编译器找不到头文件时,简单地更改包含的头文件的名称是不安全的,甚至是不明智的。具有相似名称的标题不一定相互关联 这里似乎

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

#include <sys/io.h>
#包括

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

如果我把它改成

#include <sys/uio.h>
#包括
它会神奇地工作。有人能给我解释一下区别吗?为什么有些操作系统有一个而没有另一个


编辑:这个问题发生在Linux上,而不仅仅是在OS X上。一般来说,当编译器找不到头文件时,简单地更改包含的头文件的名称是不安全的,甚至是不明智的。具有相似名称的标题不一定相互关联

这里似乎就是这样: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
指令,确保警告已启动,并查看编译器会抱怨什么(如果有的话)缺少声明。这将为您提供一个句柄,用于确定应该包含哪些标头(如果有)来代替缺少的标头。

什么是
,为什么要包含它?@melpomene它是posix库的标头,或者是一个受广泛支持的unix标头。不完全确定是哪个。威廉,欢迎来到麦克土地,从表面上看。那边有点怪。无论如何,这几乎是一个骗局:@user4581301在发布这个问题之前,我已经读过了。不幸的是,这对我没有帮助,因为我在fedora中遇到了这个问题,而不是OS X。
来自POSIX:当简单地注释掉
#include
时,你的代码难道不编译吗?