gpt4 book ai didi

c++ - 为什么不定义 `__cxa_throw` 会导致链接错误?

转载 作者:行者123 更新时间:2023-12-03 09:50:15 24 4
gpt4 key购买 nike

为什么下面的C++程序与系统提供的__cxa_throw没有链接冲突?

#include <cstring>

void __cxa_throw(void *, void *, void (*)(void *)) {
std::puts("bad luck");
}

int main() {
throw 13;
}

这个符号有什么神奇之处吗?对于正常功能,这会违反 ODR,不是吗?

最佳答案

正如@Igor 指出的,您需要添加 extern "C" 以防止名称混淆。

但它起作用的原因是因为该符号很可能被定义为。这意味着如果您重新定义它,链接器将使用您的版本而不是标准的库。

Gcc's source code确认他们将其定义为弱。 我不确定原因,也许是与共享库等的一些内部兼容性......实际上,在我不知何故错过的定义上方有一条评论:

77 /* Everything from libstdc++ is weak, to avoid requiring that library
to be linked into plain C applications using libitm.so. */

这就是原因。

不用说,这样做确实是个糟糕的主意,甚至没有关于其他函数期望 __cxa_throw 执行的操作的适当文档。

关于c++ - 为什么不定义 `__cxa_throw` 会导致链接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65766800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com