C++模块中导出匿名枚举值的正确方式是什么?
关于C++模块中导出匿名枚举常量的正确性
你的做法是完全正确且符合C++标准的,具体原因如下:
匿名枚举的成员特性
stb_image.h里的匿名枚举常量(STBI_default、STBI_grey等)在C++中属于全局命名空间的标识符——匿名枚举本身不会创建新的作用域,它的成员直接暴露在包围它的作用域中(这里是全局作用域)。export using的标准用法
C++20及后续的模块标准允许使用export using语法,将其他作用域中的标识符导入并导出到当前模块的接口中。你通过export using ::STBI_default;这类语句,本质是把全局命名空间下的这些枚举常量,作为模块接口的一部分对外暴露,让导入该模块的代码可以直接使用这些名字。编译器兼容性
你在Visual C++ 2022上验证可行,实际上GCC、Clang等主流编译器也支持这种写法,因为它是标准规定的合法用法。
另外,如果你担心匿名枚举的潜在问题,也可以选择在模块中重新定义一个具名枚举来映射这些值,比如:
export enum class STBIChannels { Default = STBI_default, Grey = STBI_grey, GreyAlpha = STBI_grey_alpha, RGB = STBI_rgb, RGBA = STBI_rgb_alpha };
但这种方式会增加冗余代码,你的原始写法已经足够简洁且合规,没必要多此一举。
总结:你的当前实现是正确的,可以放心使用。
内容的提问来源于stack exchange,提问作者Gregor Grunz
相关产品推荐
相关产品推荐

