如何检测是否定义了errno_t?

viv*_*dos 5 c++ typedef errno

我正在使用来自Visual C++ 2008的gcc编译代码.代码使用的是errno_t,但在某些版本的gcc头文件中包含的内容<errno.h>并没有定义类型.如何检测类型是否已定义?是否有定义信号表明类型已定义?在未定义的情况下,我想提供typedef以让代码在所有平台上正确编译.

ale*_*gle 6

微软errno_t是多余的.errno由ISO C标准定义为可修改的左值int.如果您的代码需要存储errno值,那么您应该将它们放入int.

进行全局搜索和替换s/errno_t/int/,您就完成了.

编辑:此外,您不应该typedef int errno_t在代码中提供,因为所有以名称结尾的名称_t都是保留的.

  • C99枚举标准头文件中定义的类型,并警告"以'int`或`uint`开头并以`_t`结尾的typedef名称可以添加到`stdint.h`但它不会禁止`*_t`完全. (4认同)
  • sbi:嗯,我没有准备好答案,所以我做了一些研究._t命名空间被广泛描述为"由POSIX保留",但我在POSIX规范中找不到任何相关的东西.最好的来源是glibc:http://www.gnu.org/s/libc/manual/html_node/Reserved-Names.html.我认为可以归结为POSIX或ISO C可能定义新的_t名称这一事实,因此在许多人看来,应用程序代码中最好避免使用它们. (2认同)
  • 这是POSIX保留`_t`的引用:http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_02_02 (2认同)

hob*_*bbs 2

您无法像检查宏那样检查 typedef,因此这有点棘手。如果您正在使用autoconf此补丁显示了您需要让 autoconf 检查是否存在errno_t并定义它(如果缺少)的最小更改(typedef 将放置在包含您生成的文件中config.h,并且包含在所有需要的文件中)errno_t)。如果您不使用,autoconf则需要想出某种方法在构建系统中执行相同的操作,或者针对编译器版本宏进行一组非常聪明的测试。

  • 亚历克斯的答案,而不是这个,才是正确的答案。`errno_t` 绝对不能用于任何用途,因为 `errno` 的类型被指定为 `int`。 (3认同)
  • 计算机紧急响应小组 (CERT) 的又一个无意义的建议。 (2认同)