我只看到一个标题C“;图书馆:https://github.com/zserge/jsmn/blob/master/jsmn.h
据我所知,这段代码将被编译到每个对象文件中,其中.c文件包含jsmn.h,浪费了空间
(该文件的函数定义位于#ifndef JSMN_头中,因此您可以通过定义JSMN_头将其用作“传统”头文件。)
- 为什么它没有被写成一个;传统的
.c和.h配对 - 重复数据删除链接器的功能是否足够聪明?我会预料到的;“重复符号”;错误
- 在C中,将代码放在头中有什么好处?(不是C++)
- 如果在导入之前使用
#define JSMN_头,从何处获取函数定义 jsmn.h作为标题是否只是一个聪明的技巧,我可以从中学习
根据定义的宏,标题将展开为以下内容之一:
- 没有宏-函数定义(公共函数是非静态的,私有函数是)
JSMN_头-函数声明(仅适用于公共函数)JSMN_STATIC–STATIC函数定义(用于私有和公共函数)
如果只有一个TU需要库,您可以在(1)和(3)之间自由选择
如果有多个TU需要该库,则需要(1)在其中一个TU中,以及(2)在所有其他TU中。那么唯一的事情就是;“浪费”;是跳过(2)的函数定义的预处理器时间,但这不重要,因为它们太小了
在这种情况下,尝试使用(1)表示所有TU将给您“1”;“重复符号”;链接器错误。尝试使用(3)表示所有TU都会默默地复制符号,这是浪费
为什么它没有被写成一个;传统的。c和h对
为了分发和使用图书馆的便利
链接器是否足够聪明,可以在对象文件之间重复功能相同的定义?我会预料到的;“重复符号”;错误
它可能不够聪明,但也不一定要聪明
您需要定义宏,以便只有一个TU具有这些定义
在C中,将代码放在头中有什么好处
要分发的源文件更少
如果在导入之前使用
#define JSMN_头,从何处获取函数定义
从您的另一个TU,在包含标头之前未定义此宏
jsmn.h作为标题是否只是一个聪明的技巧,我可以从中学习
对