【问题标题】:ssize_t is undefined [duplicate]ssize_t 未定义 [重复]
【发布时间】:2019-05-12 22:09:46
【问题描述】:

在我的代码中,我使用的是 ssize_t,但是当我尝试编译项目时,我得到了 错误:未知类型名称“ssize_t”;你的意思是“size_t”吗?

要编译项目,我使用 cc -std=c11 -O3 我包括 stdint.h,我也尝试过 stddef.h 和其他。

我必须使用一些标志还是什么?

【问题讨论】:

    标签: c posix gnu


    【解决方案1】:

    “signed-size_t”不是标准 C 的一部分,而是特定于 POSIX(Unix、BSD、Linux 等)并且位于 sys/types.h 中:

    https://pubs.opengroup.org/onlinepubs/7908799/xsh/systypes.h.html

    在 Windows 上,ssize_t 未定义,但 SSIZE_T 已定义 - 但我假设您使用的是 POSIX 系统。

    【讨论】:

    • 虽然正确,但您提供的 POSIX 规范的链接有点过时了。当前是here
    • 除此之外,没有任何理由使用ssize_t,除非使用返回它的接口,除非您包含定义它的标头,否则它将不可用。
    • @R.. 或者如果你想创建一个返回大小并可以报告错误的函数。
    • @alx 这是一个糟糕的设计,imo。改用有区别的联合(又名标记联合) - 它将使用相同数量的存储,但清楚地表明意图。
    • @Dai,这就是大多数标准 C 库以及 POSIX 函数和系统调用的设计方式。我不认为这很糟糕。事实上,我认为 tagged union 很糟糕(因为性能)。我不确定您打算如何使用 union 而不知道您可以使用哪些字段,因为它是未定义的行为。您可能需要一个 struct 包围 union 并提供有关要使用的字段的信息,与一个可以是正数或负数来表示两种不同事物的简单数字相比,这已经是很多开销了。此外,无符号整数非常危险
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2019-08-06
    • 2013-03-22
    • 2014-12-21
    • 2019-01-28
    • 2017-10-11
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多