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

标签 c++ c inline header-only

我花了一些时间开发一个仅包含 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/

相关文章:

css - 使用CSS将灵活宽度的内容居中

html - 如何将我的 HTML 元素保持在父 DIV 内的同一水平面上?

c++ - 使用 constexpr 和 CryptoPP 的编译时散列

c++ - vector中元素的boost::variant和打印方法

更正 C 中自定义整数类型的格式说明符以确保可移植性

c++ - main() 函数是可重入的吗?

java - 在 J2EE 应用程序中内联显示 MS-Office 文档和电子表格

c++ - 这是一个有效的 C 语句吗?

c++ - 为什么我的值被位域除以 2

c - pipe - fork - c - 为什么程序没有任何错误而没有响应?