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

标签 c linux posix

有时我看到编译器提示这一行

#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/

相关文章:

c++ - Linux/POSIX 相当于 C++ 代码中的 Win32 API TerminateProcess

c - Linux内核模块中的Write函数被重复调用

c - Windows上标准c库的dll文件名是什么?

c - 在字符指针数组中打印元素时未确定的行为?

linux - bash 脚本来替换单词

c - 使用管道在线程之间发送数据

c - 如何获取集合的所有可能的子集

c - 如何使用 C 管理 linux tmp 空间

c - 我们有任何模式匹配字符串搜索吗?/

c++ - 释放锁定的内存是否会解锁相应的页面?