如果我编译了一个库,其中包含一个保证在某个编译器上工作的未定义行为函数,那么它可以移植到其他编译器吗?
我认为该库已经生成了程序集,因此,当其他程序调用UB函数时,将执行为某个编译器定义的函数程序集。
我做错了什么?
不要在C++标准中寻找所有答案。
C++标准没有定义由不同编译器编译的对象模块链接在一起时的行为。C++标准的管辖范围仅仅是单个C++实现,其创建者选择遵守C++标准。
应用程序二进制接口(ABI(将不同的对象模块链接在一起。如果使用两个都符合相同ABI的编译器编译两个函数,并使用符合ABI的链接器将它们链接起来,那么它们通常应该一起工作。还有一些额外的细节需要考虑,比如语言中的各种事物如何绑定到ABI中的相应事物。例如,一个编译器可能会将long
映射到ABI中的某个32位整数类型,而另一个编译器则可能将long
映射到某个64位整数类型。除非进行相应的调整,否则这当然会干扰函数的协同工作。