考虑C库中定义的以下函数:
void f(void (*callback)(int)) { callback(0); }
Run Code Online (Sandbox Code Playgroud)
这将从C++ 11程序中调用callback(),可能会引发异常,如下所示:
void callback(int) { /* can I throw ? */}
try {
f(callback);
} catch (...) {
/* can the exception be caught ? */
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
f()?如果没有,我必须/应该callback()用说明noexcept符声明吗?下面的源代码可以编译。
异常.cpp:
extern "C"
void throwInCPP() {
throw 5;
}
Run Code Online (Sandbox Code Playgroud)
主程序
#include <stdio.h>
void throwInCPP();
void throwExp(void (*callback)()) {
callback();
}
int main() {
throwExp(throwInCPP);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当它运行时,将抛出异常,并且程序展开堆栈尝试找到 catch 块,但找不到。然后发生中止:
#0 0x00007ffff7238d67 in raise () from /usr/lib/libc.so.6
#1 0x00007ffff723a118 in abort () from /usr/lib/libc.so.6
#2 0x00007ffff7b2e1f5 in __gnu_cxx::__verbose_terminate_handler() ()
from /usr/lib/libstdc++.so.6
#3 0x00007ffff7b2c076 in ?? () from /usr/lib/libstdc++.so.6
#4 0x00007ffff7b2c0c1 in std::terminate() () from /usr/lib/libstdc++.so.6
#5 0x00007ffff7b2c2d8 in __cxa_throw () from /usr/lib/libstdc++.so.6
#6 0x00000000004007fa in throwInCPP ()
#7 0x00000000004007bd in throwExp (callback=0x4007d4 <throwInCPP>) at main.c:6
#8 0x00000000004007cd in main () at main.c:11
Run Code Online (Sandbox Code Playgroud)
我认为你总是可以调用一个在 c 中抛出期望的 cpp 函数,但你永远不能在 c 中放置 catch 块,因为它无法编译。
C++异常处理运行时是如何实现的?这解释了异常在 C++ 中是如何工作的。
我真的不认为在 c 中抛出异常会是一件好事,因为你不能以“正常”方式对它做任何事情。
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |