我偶然发现了来自https://github.com/nothings/stb/的图像处理库,当我尝试使用 C++ 模块时,我尝试使用 stb_image.h“作为模块”。
为此,我编写了一个小型包装模块(与 glm 演示的技术相同, https://github.com/g-truc/glm,它将其库包装为 glm.cppm 内的 C++ 模块),它似乎运行良好:
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;
我完全不确定如何处理 stb_image.h 中作为未命名枚举提供的这些 STBI 值:
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”头文件进行任何修改。
适用导出常量的相关规则。模块在 §10.7 [module] 中介绍,枚举在 §9.7 [dcl.enum] 中解释,但未命名的枚举遵循常量的一般导出规则,这就是没有直接引用的原因。