Visual Studio中的枚举类库和不同版本的混合库

ybzsozfc  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(129)

我知道你不能在同一个项目中使用不同的STL实现,特别是像std::vector这样的东西。
我想知道在面向公众的API中使用enum class作为参数是否存在类似的问题?
例如:

enum class MessageCategory
{
    A,
    B,
    C
};

void foo(MessageCode myMessageCode);

目前,在我的面向公众的API中,我没有使用enum class,而是将它们作为int提供

void foo(int myMessageCode);
ni65a41a

ni65a41a1#

枚举类型是与其基础类型不同的类型。因此从语言的Angular 来看,采用基础类型的函数和采用枚举类型的函数是不同的函数,并且是同名的重载。因此,在标准的意义上,仅仅改变函数定义中的类型就会导致ODR违规,因为缺少原始签名的定义,链接器会抱怨这一点。
但在所有合理的实现中,枚举类型将具有与其底层类型相同的大小,对齐和表示(尽管目前标准在技术上不要求)。
因此,如果您关心ABI兼容性(并假设核心语言ABI在两个版本之间没有变化),这可能只是一个名称混乱问题,因为您可以简单地强制链接器将两个符号视为相同。
我说“可能”,因为从技术上讲,核心语言ABI可以。指定调用约定以不同方式处理类型。我没有检查任何ABI规范。
但是,在任何情况下,从基础类型更改为枚举类型肯定是不兼容的API更改,因为它会影响调用函数时的重载解析和参数转换。
对于没有显式指定基础类型的enum枚举(不是enum class)也有一个例外。这些的有效值集合可以是基础类型的有效值集合的严格子集。在这种情况下,从技术上讲,您可以仅基于类型的行为来获得ABI差异,因为编译器可能被允许对枚举类型执行比基础类型更积极的优化。

相关问题