gpt4 book ai didi

c - POSIX/SUS header 中的类型定义

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:00 25 4
gpt4 key购买 nike

这个问题涉及需要在 POSIX/SUS 标准的必需 header 中定义的各种类型。

有些类型需要在许多头文件中定义,我想知道实现这一点的正确且合规的方法是什么。

例如,查看 <time.h> header 规范:

Inclusion of the header may make visible all symbols from the <signal.h> header.

这很简单,<signal.h>包含在 <time.h> 中.

现在这个怎么样:

The clock_t, size_t, time_t, clockid_t, and timer_t types shall be defined as described in <sys/types.h>.

据我了解,这意味着我们不能简单地包括 <sys/types.h>来自 <time.h> ,因为这会暴露比所需更多的符号。

那么有人可以证实这一点吗?
包含 <sys/types.h> 会违反标准合规性吗? ?

如果是这样,我认为最好的解决方案是为每种类型创建一个特定的标题,这样就可以使特定类型从任何地方都可见,而不必担心其他符号。
还有其他好的解决办法吗?

最后,C 标准中的类型呢?
POSIX/SUS 规范中的许多类型都是整数类型,并且可能需要具有固定宽度。

那么标准是否可以包含 <stdint.h>来自特定 header ,还是会破坏合规性?

最佳答案

你是对的,从额外的头文件中暴露不需要的类型和声明是不符合规范的。

一个微不足道的(但是,就预处理器打开文件所花费的时间而言,这是昂贵的)解决方案是为每种类型设置一个单独的 header ,并且在您需要时,例如 time_t,请执行以下操作:

#include <types/time_t.h>

当然 types/time_t.h 会有适当的多重包含保护。

还有很多其他方法可以达到同样的目的。 glibc 和 gcc 使用的方法是拥有特殊的“需要的”宏,您可以在包含一个 header 之前定义它,该 header 要求它只提供一种或多种类型。这个解决方案也非常昂贵,可能比上面的更昂贵,因为它打破了编译器对多重包含保护的启发。编译器无法消除重复的包含;每次包含文件时,它都必须解析文件。

我们在 musl 中的做法是有一个文件,bits/alltypes.h,其中包含多个 header 和宏所需的所有类型的定义,以控制哪些被公开.它由隐藏所有宏逻辑的简单 sed 脚本生成:

关于c - POSIX/SUS header 中的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com