我花了一些时间开发仅标头的库,偶然发现了一个十字路口。我在网上看到的任何地方,总是使用内联函数。但是在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会这样做?)
答案 0 :(得分:4)
STB是C库。 C inline是C99中引入的,不能像C ++ inline那样工作。 C内联仍然必须仅在一个翻译单元中实现。
C ++内联用于在ODR规则中设置异常,并允许多个实现,只要它们相同即可。
STB希望成为仅标头的库,但实际上C中并不存在它们,因此他们使用基于宏的解决方案仅在选定的翻译单元中实现代码。