包含在特定编译器上工作的未定义行为函数的库是可移植的吗?
Library that includes undefined behavior function working on a certain compiler is portable?
如果我编译的库包含保证在特定编译器上运行的未定义行为函数,它可以移植到其他编译器吗?
我以为库已经生成了汇编,所以,当其他程序调用UB函数时,会执行特定编译器定义好的函数汇编。
我哪里错了?
不要在 C++ 标准中查找所有答案。
C++ 标准没有定义将不同编译器编译的目标模块 link 编辑在一起时的行为。 C++ 标准的管辖范围仅限于其创建者选择符合 C++ 标准的单个 C++ 实现。
应用程序二进制接口 (ABI) 涵盖了将不同的对象模块链接在一起。如果您使用两个都符合相同 ABI 的编译器编译两个函数,并且 link 它们使用符合 ABI 的 linker,它们通常应该一起工作。还有其他细节需要考虑,例如语言中的各种事物如何绑定到 ABI 中的相应事物。例如,一个编译器可能将 long
映射到 ABI 中的某个 32 位整数类型,而另一个编译器可能将 long
映射到某个 64 位整数类型,这当然会干扰函数共同努力,除非做出相应的调整。
如果我编译的库包含保证在特定编译器上运行的未定义行为函数,它可以移植到其他编译器吗?
我以为库已经生成了汇编,所以,当其他程序调用UB函数时,会执行特定编译器定义好的函数汇编。
我哪里错了?
不要在 C++ 标准中查找所有答案。
C++ 标准没有定义将不同编译器编译的目标模块 link 编辑在一起时的行为。 C++ 标准的管辖范围仅限于其创建者选择符合 C++ 标准的单个 C++ 实现。
应用程序二进制接口 (ABI) 涵盖了将不同的对象模块链接在一起。如果您使用两个都符合相同 ABI 的编译器编译两个函数,并且 link 它们使用符合 ABI 的 linker,它们通常应该一起工作。还有其他细节需要考虑,例如语言中的各种事物如何绑定到 ABI 中的相应事物。例如,一个编译器可能将 long
映射到 ABI 中的某个 32 位整数类型,而另一个编译器可能将 long
映射到某个 64 位整数类型,这当然会干扰函数共同努力,除非做出相应的调整。