如何检测是否定义了errno_t?

时间:2009-09-23 08:29:47

标签: c++ typedef errno

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

4 个答案:

答案 0 :(得分:6)

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

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

修改:此外,您不应在代码中提供typedef int errno_t,因为所有以_t结尾的名称都会被保留。

答案 1 :(得分:2)

你不能以宏的方式检查typedef,所以这有点棘手。如果您使用autoconf,则this patch会显示您需要进行autoconf检查是否存在errno_t所需的最小更改,并在缺少时将其定义(typedef将放置在包含您生成的config.h的文件,包含在需要errno_t的所有文件中。如果你没有使用autoconf,你需要想出一些方法在你的构建系统中做同样的事情,或者对编译器版本宏做一套非常聪明的测试。

答案 2 :(得分:0)

这通常是GNU autoconf来救援的情况。基本上,autoconf将生成一个配置脚本,该脚本可以检测各种与系统相关的功能,例如此类型是否存在以及如何定义。然后,在应用程序中包含生成的C头文件。

答案 3 :(得分:0)

如果您知道哪些版本的GCC给您带来了麻烦,您可以测试它们。您可以使用以下内容检查GCC的版本:

  #if __GNUC__ == 3
  ...
  #else
  ...
  #endif