- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个问题涉及需要在 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/
这个问题涉及需要在 POSIX/SUS 标准的必需 header 中定义的各种类型。 有些类型需要在许多头文件中定义,我想知道实现这一点的正确且合规的方法是什么。 例如,查看 header 规范:
信号因实现而异。 APUE(Unix环境中的高级编程)中有一些不错的表格,例如第2版第292页的“图10.1 UNIX系统信号”。 让我们以 SIGWAITING 为例。信号出现in the docu
我正在致力于将 bash 脚本移植到 SUS/POSIX 兼容的 shell。我自己能够消除大部分的羞辱,但目前我只能坚持最后一个。 该脚本用于根据 cron.d 目录中的文件生成 crontab,并
有时我需要编写低级多平台 C/C++ 代码,以便预处理器环境 macroses 派上用场。但是是否有某种方法或单个互联网资源或在 man 中我可以轻松找到一个标准,在该标准中首次引入特定的 Unix
我是一名优秀的程序员,十分优秀!