header-only C "libraries" 不浪费吗?
Aren't header-only C "libraries" wasteful?
我正在查看 header-only C“库”:https://github.com/zserge/jsmn/blob/master/jsmn.h
据我了解,此代码将被编译到每个 object 文件中,其中 .c 文件包含 jsmn.h
,浪费 space.
(文件的函数定义在 #ifndef JSMN_HEADER
内,因此您可以通过定义 JSMN_HEADER 将其用作“传统”header 文件。)
- 为什么它没有写成“传统”
.c
和 .h
对?
- 链接器是否足够聪明,可以删除 object 文件之间相同的定义?我会预料到“重复符号”错误。
- 将代码放在 header 中对 C 语言有什么好处? (不是 C++。)
- 如果您在导入前使用
#define JSMN_HEADER
,您从哪里获得函数定义?
jsmn.h
是 header-only 一个聪明的把戏,我可以从中学习吗?
header 扩展为以下之一,具体取决于定义的宏:
- 没有宏 — 函数定义(public 函数是 non-static,私有函数是)。
JSMN_HEADER
— 函数声明(仅限 public 函数)。
JSMN_STATIC
— static
函数定义(对于私有函数和 public 函数)。
如果只有一个TU需要这个库,你可以在(1)和(3)之间自由选择。
如果不止一个 TU 需要该库,您需要 (1) 在其中一个 TU 中,(2) 在所有其他 TU 中。那么唯一“浪费”的是跳过 (2) 的函数定义的预处理器时间,但这无关紧要,因为它们太小了。
在这种情况下,尝试对所有 TU 使用 (1) 会给您带来“重复符号”链接器错误。尝试对所有 TU 使用 (3) 会默默地复制符号,这会很浪费。
Why hasn't it been written as a "traditional" .c and .h pair?
为了方便分发和使用库。
Is the linker clever enough to dedup function identical definitions between object files? I would have expected "duplicate symbol" errors.
它可能不够聪明,但没必要。
您需要定义宏,以便只有一个 TU 具有定义。
What advantage does putting code in headers give in C?
要分发的源文件较少。
From where do you get the function definitions if you use #define JSMN_HEADER
before importing?
来自您在包含 header.
之前未定义此宏的其他 TU
Is jsmn.h
being header-only a clever trick, from which I can learn?
是的。
我正在查看 header-only C“库”:https://github.com/zserge/jsmn/blob/master/jsmn.h
据我了解,此代码将被编译到每个 object 文件中,其中 .c 文件包含 jsmn.h
,浪费 space.
(文件的函数定义在 #ifndef JSMN_HEADER
内,因此您可以通过定义 JSMN_HEADER 将其用作“传统”header 文件。)
- 为什么它没有写成“传统”
.c
和.h
对? - 链接器是否足够聪明,可以删除 object 文件之间相同的定义?我会预料到“重复符号”错误。
- 将代码放在 header 中对 C 语言有什么好处? (不是 C++。)
- 如果您在导入前使用
#define JSMN_HEADER
,您从哪里获得函数定义? jsmn.h
是 header-only 一个聪明的把戏,我可以从中学习吗?
header 扩展为以下之一,具体取决于定义的宏:
- 没有宏 — 函数定义(public 函数是 non-static,私有函数是)。
JSMN_HEADER
— 函数声明(仅限 public 函数)。JSMN_STATIC
—static
函数定义(对于私有函数和 public 函数)。
如果只有一个TU需要这个库,你可以在(1)和(3)之间自由选择。
如果不止一个 TU 需要该库,您需要 (1) 在其中一个 TU 中,(2) 在所有其他 TU 中。那么唯一“浪费”的是跳过 (2) 的函数定义的预处理器时间,但这无关紧要,因为它们太小了。
在这种情况下,尝试对所有 TU 使用 (1) 会给您带来“重复符号”链接器错误。尝试对所有 TU 使用 (3) 会默默地复制符号,这会很浪费。
Why hasn't it been written as a "traditional" .c and .h pair?
为了方便分发和使用库。
Is the linker clever enough to dedup function identical definitions between object files? I would have expected "duplicate symbol" errors.
它可能不够聪明,但没必要。
您需要定义宏,以便只有一个 TU 具有定义。
What advantage does putting code in headers give in C?
要分发的源文件较少。
From where do you get the function definitions if you use
#define JSMN_HEADER
before importing?
来自您在包含 header.
之前未定义此宏的其他 TUIs
jsmn.h
being header-only a clever trick, from which I can learn?
是的。