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 文件。)

header 扩展为以下之一,具体取决于定义的宏:

  1. 没有宏 — 函数定义(public 函数是 non-static,私有函数是)。
  2. JSMN_HEADER — 函数声明(仅限 public 函数)。
  3. JSMN_STATICstatic 函数定义(对于私有函数和 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?

是的。