内联和通过宏包含源之间的区别

时间:2019-06-10 16:17:13

标签: c++ c inline header-only

我花了一些时间开发仅标头的库,偶然发现了一个十字路口。我在网上看到的任何地方,总是使用内联函数。但是在stb_image.h的示例中,源代码只是写在标头的下半部分,并由#ifdef STB_IMAGE_IMPLEMENTATION包围,如下所示:

#ifndef STB_IMAGE_H_INCLUDED_
#define STB_IMAGE_H_INCLUDED_

void some_func(args);

#endif // STB_IMAGE_H_INCLUDED_

#ifdef STB_IMAGE_IMPLEMENTATION

void some_func(args) {
    // implementation
}

#endif // STB_IMAGE_IMPLEMENTATION;

然后,一个(最好是不是main.cpp的源文件)文件定义了一个具有相同名称的宏,并且紧随其后包括了标头,如下所示:

#include <…>
#include <…>

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

// other code

您为什么要在另一个上使用一个? (或者为什么为什么stbi会这样做?)

1 个答案:

答案 0 :(得分:4)

STB是C库。 C inline是C99中引入的,不能像C ++ inline那样工作。 C内联仍然必须仅在一个翻译单元中实现。

C ++内联用于在ODR规则中设置异常,并允许多个实现,只要它们相同即可。

STB希望成为仅标头的库,但实际上C中并不存在它们,因此他们使用基于宏的解决方案仅在选定的翻译单元中实现代码。