Я наткнулся на библиотеки обработки изображений из https://github.com/nothings/stb/ и, экспериментируя с модулями C++, я попытался использовать stb_image.h «как модуль».
Для этого я написал небольшой модуль-оболочку (тот же метод, что и glm, https://github.com/g-truc/glm, который обеспечивает обертку своей библиотеки как модуль C++ внутри glm.cppm), и кажется работать как шарм:
module;
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
export module stb_image;
// this "seems" correct
export using ::stbi_uc;
// this should be correct
export stbi_uc *stbi_load(char const *filename,int *x,int *y,int *comp,int req_comp);
export void stbi_image_free(void *retval_from_stbi_load);
// is this the correct way to export enum values?
export using ::STBI_default;
export using ::STBI_grey;
export using ::STBI_rgb;
export using ::STBI_rgb_alpha;
Я вообще не уверен, как обращаться с этими значениями STBI, которые предоставляются в stb_image.h как безымянное перечисление:
enum
{
STBI_default = 0, // only used for desired_channels
STBI_grey = 1,
STBI_grey_alpha = 2,
STBI_rgb = 3,
STBI_rgb_alpha = 4
};
Я экспериментировал выше, и, по крайней мере, Visual C++ 2022 «принимает» то, что я придумал, и код выполняется правильно, значения можно использовать из другого кода, импортирующего этот модуль «stbi_image».
Но, просматривая Интернет, я не смог найти никакого описания того, «если вообще и как» такие значения перечисления из безымянного перечисления могут быть экспортированы в модуль C++.
Правильно ли я сделал это?





Да, то, что вы сделали, действительно является правильным способом экспорта значений перечисления из безымянного перечисления в модуле C++20. Visual C++ 2022, принимающий этот подход и правильное выполнение кода, является дальнейшей проверкой вашей реализации.
Этот метод гарантирует, что значения перечисления, определенные в «stb_image.h», могут использоваться в любом коде, который импортирует ваш модуль «stb_image», без каких-либо изменений в исходном заголовочном файле «stb_image.h».
Спасибо за ответ! Возможно, вы знаете, «где» в стандарте C++ это объясняется? Возможно, я слеп, но мне не удалось найти четкого утверждения об экспорте перечислений, хотя и безымянных.