Разница между встраиванием и включением источника через макрос - PullRequest
2 голосов
/ 10 июня 2019

Я потратил некоторое время на разработку библиотеки только для заголовков и наткнулся на перекресток.Везде, где я смотрю в Интернете, всегда используются встроенные функции.Но в примере 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;

Затем a (предпочтительно источник, который не является основнымФайл .cpp) определяет макрос с таким же именем и сразу после него включает заголовок:

#include <…>
#include <…>

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

// other code

Зачем использовать один над другим?(или, вернее, зачем вообще это делать?)

1 Ответ

4 голосов
/ 10 июня 2019

STB - это библиотека CC inline был представлен в C99 и не работает как C ++ inline.C-inline все еще должен быть реализован только в одной единице перевода.

C ++ inline используется для исключения в правиле ODR и допускает множественную реализацию, если они одинаковы.

STB хочет быть библиотекой только для заголовков, но они этого не делаютдействительно существуют в C, поэтому они использовали решение на основе макросов для реализации кода только в выбранной единице перевода.

...