仅仅是标题C“库”不是很浪费吗?

我只看到一个标题C“;图书馆:https://github.com/zserge/jsmn/blob/master/jsmn.h

据我所知,这段代码将被编译到每个对象文件中,其中.c文件包含jsmn.h,浪费了空间

(该文件的函数定义位于#ifndef JSMN_头中,因此您可以通过定义JSMN_头将其用作“传统”头文件。)

  • 为什么它没有被写成一个;传统的.c.h配对
  • 重复数据删除链接器的功能是否足够聪明?我会预料到的;“重复符号”;错误
  • 在C中,将代码放在头中有什么好处?(不是C++)
  • 如果在导入之前使用#define JSMN_头,从何处获取函数定义
  • jsmn.h作为标题是否只是一个聪明的技巧,我可以从中学习

根据定义的宏,标题将展开为以下内容之一:

  1. 没有宏-函数定义(公共函数是非静态的,私有函数是)
  2. JSMN_头-函数声明(仅适用于公共函数)
  3. JSMN_STATICSTATIC函数定义(用于私有和公共函数)

如果只有一个TU需要库,您可以在(1)和(3)之间自由选择

如果有多个TU需要该库,则需要(1)在其中一个TU中,以及(2)在所有其他TU中。那么唯一的事情就是;“浪费”;是跳过(2)的函数定义的预处理器时间,但这不重要,因为它们太小了

在这种情况下,尝试使用(1)表示所有TU将给您“1”;“重复符号”;链接器错误。尝试使用(3)表示所有TU都会默默地复制符号,这是浪费

为什么它没有被写成一个;传统的。c和h对

为了分发和使用图书馆的便利

链接器是否足够聪明,可以在对象文件之间重复功能相同的定义?我会预料到的;“重复符号”;错误

它可能不够聪明,但也不一定要聪明

您需要定义宏,以便只有一个TU具有这些定义

在C中,将代码放在头中有什么好处

要分发的源文件更少

如果在导入之前使用#define JSMN_头,从何处获取函数定义

从您的另一个TU,在包含标头之前未定义此宏

jsmn.h作为标题是否只是一个聪明的技巧,我可以从中学习

发表评论