【发布时间】:2021-04-22 07:04:48
【问题描述】:
为什么下面的C++程序与系统提供的__cxa_throw没有链接冲突?
#include <cstring>
void __cxa_throw(void *, void *, void (*)(void *)) {
std::puts("bad luck");
}
int main() {
throw 13;
}
这个符号有什么神奇之处吗?对于正常功能,这将违反 ODR,不是吗?
【问题讨论】:
-
运行时提供的函数可能是
extern "C",而你的函数名却是乱码。无论如何,这个程序通过使用保留名称表现出未定义的行为。 -
ODR: "...不需要编译器来诊断此违规行为,但违反它的程序的行为未定义..." en.cppreference.com/w/cpp/language/definition
-
@IgorTandetnik:用
extern "C"尝试过,仍然有效,没有链接错误。 -
@RichardCritten:当然,但是对于其他符号,它确实会导致链接错误 - 所以我的问题是为什么不是这个?
-
你不能定义任何以双下划线开头的符号。这些符号是为编译器和标准库保留的。 stackoverflow.com/a/224420/1387438
标签: c++ linux gcc c++17 libstdc++