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

标签 c types posix header-files sus

这个问题涉及需要在 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/

相关文章:

c - 将范围划分为N个相等的数字

C Scanf 循环

haskell - 编译时检查的 URI

c# - 为什么ushort + ushort等于int?

XSLT 从 DTD 获取属性类型

c - 内存映射文件的大小不断增大

java - 在 Java 虚拟机中处理信号

c - 如何用C写一个程序来测量缓存的速度?

python - 在 Python 输出中引用 POSIX shell 特殊字符

c - 指针作为函数参数?