我花了一些时间开发一个仅包含 header 的库,但偶然发现了一个十字路口。我在网络上看到的任何地方,总是使用内联函数。但在 stb_image.h
的示例中,源代码只是写在 header 的下半部分,周围是 #ifdef STB_IMAGE_IMPLMENTATION
,如下所示:
#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 为什么要这样做?)
最佳答案
STB 是一个 C 库。 C 内联是在 C99 中引入的,并且不像 C++ 内联那样工作。 C 内联仍然必须仅在一个翻译单元中实现。
C++内联用于对ODR规则进行异常(exception)处理,允许多种实现,只要相同即可。
STB 希望成为一个仅包含头文件的库,但它们实际上并不存在于 C 语言中,因此他们使用基于宏的解决方案仅在选定的翻译单元中实现代码。
关于c++ - 内联和通过宏包含源之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56529997/