5

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

4

4 回答 4

6

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

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

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

于 2009-09-23T08:47:02.133 回答
2

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

于 2009-09-23T08:42:43.000 回答
0

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

于 2009-09-23T08:45:22.603 回答
0

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

  #if __GNUC__ == 3
  ...
  #else
  ...
  #endif
于 2009-09-23T08:56:10.770 回答