将 inline 函数定义在头文件中
编译器在目标代码中展开和嵌入 inline 函数时,需要这个函数和当前被编译的单元主体(当前源文件)有一定的关系,而一个编译单
元主体中的源代码逻辑与其它文件发生关系的唯一途径,就是通过 include 指令引入一个头文件中的相关申明与定义。
如果试图将一个 inline 函数定义在 a.c 中,并在没有采用 #include "a.c" 指令 的情况下,在 b.c 中引用这个 inline 函数,并
期望此函数如同一般 inline 函数一般在 b.c 的目标码中展开,这同时对源代码、编译器和链接器提出了要求:
1. 必须在当前编译单元主体中以 extern inline 的方式申明此待展开的函数
2. 2.1 以 1 为前提,编译器对当前编译单元主体中的 extern inline 调用作特殊标记,说明该处需要插入一段代码,否则编译
器会在该处产生一段函数调用代码
2.2 编译器 "必须" 将所有 inilne 函数编译成目标块,并作对应标记,以便于链接器引用。
3. 链接器处理 2.1 中的标记,即从 2.2 生成的内容中,查找对应的目标代码块,嵌入到 2.1 所述相关位置。
上述 3 点给编译器和链接器带来了更高的要求。但一般情况下,compiler 和 linker 并不满足 2 和 3 所述处理方式,而仅仅是简单
地由 compiler 将 "可见" 的 inline 代码嵌入在当前编译单元中,linker 对此更是袖手旁观,因此无法冀望在 b.c 中引用定义在
a.c 中的 inline 函数会产生理想的效果,所以,最好还是将 inline 函数定义在头文件中,并在需要的单元中引用这个头文件 。
编译器在目标代码中展开和嵌入 inline 函数时,需要这个函数和当前被编译的单元主体(当前源文件)有一定的关系,而一个编译单
元主体中的源代码逻辑与其它文件发生关系的唯一途径,就是通过 include 指令引入一个头文件中的相关申明与定义。
如果试图将一个 inline 函数定义在 a.c 中,并在没有采用 #include "a.c" 指令 的情况下,在 b.c 中引用这个 inline 函数,并
期望此函数如同一般 inline 函数一般在 b.c 的目标码中展开,这同时对源代码、编译器和链接器提出了要求:
1. 必须在当前编译单元主体中以 extern inline 的方式申明此待展开的函数
2. 2.1 以 1 为前提,编译器对当前编译单元主体中的 extern inline 调用作特殊标记,说明该处需要插入一段代码,否则编译
器会在该处产生一段函数调用代码
2.2 编译器 "必须" 将所有 inilne 函数编译成目标块,并作对应标记,以便于链接器引用。
3. 链接器处理 2.1 中的标记,即从 2.2 生成的内容中,查找对应的目标代码块,嵌入到 2.1 所述相关位置。
上述 3 点给编译器和链接器带来了更高的要求。但一般情况下,compiler 和 linker 并不满足 2 和 3 所述处理方式,而仅仅是简单
地由 compiler 将 "可见" 的 inline 代码嵌入在当前编译单元中,linker 对此更是袖手旁观,因此无法冀望在 b.c 中引用定义在
a.c 中的 inline 函数会产生理想的效果,所以,最好还是将 inline 函数定义在头文件中,并在需要的单元中引用这个头文件 。