【问题标题】:How to detect if errno_t is defined?如何检测是否定义了 errno_t?
【发布时间】:2009-09-23 08:29:46
【问题描述】:

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

【问题讨论】:

    标签: c++ typedef errno


    【解决方案1】:

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

    进行全局搜索并替换 s/errno_t/int/ 即可。

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

    【讨论】:

    • "所有以_t 结尾的名字都是保留的。"是这样吗?这是在哪里声明的?
    • sbi:嗯,我没有现成的答案,所以我做了一些研究。 _t 命名空间被广泛描述为“由 POSIX 保留”,但我在 POSIX 规范中没有发现任何与此相关的内容。最好的来源来自 glibc:gnu.org/s/libc/manual/html_node/Reserved-Names.html。我认为归结为 POSIX 或 ISO C 可能会定义新的 _t 名称,因此在许多人看来,最好在应用程序代码中避免使用它们。
    • C99 枚举标准头文件中定义的类型并警告“以intuint 开头并以_t 结尾的typedef 名称可能被添加到stdint.h 但它没有” t 完全禁运 *_t
    【解决方案2】:

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

    【讨论】:

    • 谢谢。我没有可用的 autoconf,所以我想我必须进行编译器版本宏检查...
    • Alex 的答案,不是这个,是正确的答案。 errno_t 不应该用于任何事情,因为errno 的类型被指定为int
    • 人们可能有兴趣使用errno_t,因为它是 CERT 推荐的。 securecoding.cert.org/confluence/display/seccode/…
    • CERT 的另一个无意义的建议。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 2012-05-16
        • 2017-01-09
        相关资源
        最近更新 更多