2

我花了一些时间开发一个只有标题的库,并且偶然发现了一个十字路口。我在网上看到的任何地方,总是使用内联函数。但在 的示例中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 <…&gt;
#include <…&gt;

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

// other code

你为什么要使用一个而不是另一个?(或者更确切地说,为什么 stbi 会这样做?)

4

1 回答 1

4

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

C++ inline 用于在 ODR 规则中进行例外处理,并且允许多个实现,只要它们相同。

STB 想成为一个只有头文件的库,但它们实际上并不存在于 C 语言中,因此他们使用基于宏的解决方案来仅在选定的翻译单元中实现代码。

于 2019-06-10T16:27:45.530 回答