【发布时间】:2009-09-23 08:29:46
【问题描述】:
我正在使用来自 Visual C++ 2008 的 gcc 编译代码。该代码使用 errno_t,但在某些版本的 gcc 标头中,包括 <errno.h> 并没有定义类型。如何检测类型是否已定义?是否有一个定义表明该类型已定义?如果未定义,我想提供 typedef 以让代码在所有平台上正确编译。
【问题讨论】:
我正在使用来自 Visual C++ 2008 的 gcc 编译代码。该代码使用 errno_t,但在某些版本的 gcc 标头中,包括 <errno.h> 并没有定义类型。如何检测类型是否已定义?是否有一个定义表明该类型已定义?如果未定义,我想提供 typedef 以让代码在所有平台上正确编译。
【问题讨论】:
微软的errno_t 是多余的。 errno 由 ISO C 标准定义为 int 类型的可修改左值。如果您的代码需要存储errno 值,那么您应该将它们放入int。
进行全局搜索并替换 s/errno_t/int/ 即可。
编辑:另外,您不应在代码中提供typedef int errno_t,因为所有以_t 结尾的名称都是保留的。
【讨论】:
_t 结尾的名字都是保留的。"是这样吗?这是在哪里声明的?
int 或uint 开头并以_t 结尾的typedef 名称可能被添加到stdint.h 但它没有” t 完全禁运 *_t。
_t: pubs.opengroup.org/onlinepubs/9699919799/functions/…
你不能像检查宏那样检查 typedef,所以这有点棘手。如果您使用autoconf,this patch 显示您需要让 autoconf 检查是否存在errno_t 并在它缺失时定义它(typedef 将放置在包含您生成的 @ 987654325@ 并包含在所有需要errno_t 的文件中)。如果你没有使用autoconf,你需要想出一些方法在你的构建系统中做同样的事情,或者对编译器版本宏进行一组非常聪明的测试。
【讨论】:
errno_t 不应该用于任何事情,因为errno 的类型被指定为int。
errno_t,因为它是 CERT 推荐的。 securecoding.cert.org/confluence/display/seccode/…
这通常是 GNU autoconf 来救援的情况。基本上 autoconf 会生成一个配置脚本,可以检测各种系统相关的特性,例如这种类型是否存在以及它是如何定义的。然后将生成的 C 头文件包含在应用程序中。
【讨论】:
如果您知道哪些 GCC 版本给您带来了麻烦,您可以对其进行测试。您可以使用以下方式检查 GCC 的版本:
#if __GNUC__ == 3
...
#else
...
#endif
【讨论】: