我有C++函数我想要声明使用,extern "C"即使它们只在C++代码中调用.是的,我知道这很奇怪但是我想要保持一致性,因为我们混合了C和C++声明.我只是想确保声明一个C++函数extern "C"不会影响抛出的行为.
它看起来像这样:
extern "C" void foo() {throw exception;}
int bar()
{
try
{
foo();
} catch (exception e) { return 1; }
}
Run Code Online (Sandbox Code Playgroud) 我有使用一些C库的C++代码.C库采用C语言回调.我在我的C++代码中编写了一个回调函数,现在我不知何故需要报告错误(但它返回void).我想知道我是否可以从C++代码中使用的C回调中抛出异常?
这对我来说很难理解.
谢谢,Boda Cydo.
当我将Visual Studio 2019从/EHsc(仅限结构化和C ++例外)切换到/EHs(也不要假设extern "C"函数不会抛出– ref)时,我试图调查生成的代码的差异,但是我似乎无法哄骗VS当我最小化它时提供一个有用的测试用例。
我很惊讶以下内容没有做到这一点(两种情况下的程序集都是相同的),因为fptr优化器不知道所引用的函数的内容(可能的定义包含在说明中)。
void foo();
/*void foo()
{
throw 0;
}*/
extern "C"
void bar(void (*fptr)())
{
fptr();
}
int main()
{
try
{
bar(&foo);
}
catch (...) {}
}
Run Code Online (Sandbox Code Playgroud)
当然,它知道任何假定的异常都会被立即捕获,并且由于/EHsc该异常的传播结果对于Microsoft而言是“未定义的”,因此它的“出现”当然是有效的结果。但这对我没有太大帮助!
那么,如何在不引入不同翻译单元的情况下执行此实验?理想情况下,我希望能够为此提供一个Compiler Explorer片段。
我的目标是证明extern "C"以良好定义的方式允许抛出(或传播)C ++异常不会比我在交易中接受的运行时成本高。