这个问题涉及需要在 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 脚本生成:
- http://git.musl-libc.org/cgit/musl/tree/arch/i386/bits/alltypes.h.in?id=9448b0513e2eec020fbca9c10412b83df5027a16
- http://git.musl-libc.org/cgit/musl/tree/include/alltypes.h.in?id=9448b0513e2eec020fbca9c10412b83df5027a16
- http://git.musl-libc.org/cgit/musl/tree/tools/mkalltypes.sed?id=9448b0513e2eec020fbca9c10412b83df5027a16
关于c - POSIX/SUS header 中的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975008/