相关疑难解决方法(0)

可以标记为Extern"C"的C++函数抛出吗?

我有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++ extern-c

25
推荐指数
2
解决办法
4683
查看次数

我可以从旧版C回调中抛出C++异常吗?

我有使用一些C库的C++代码.C库采用C语言回调.我在我的C++代码中编写了一个回调函数,现在我不知何故需要报告错误(但它返回void).我想知道我是否可以从C++代码中使用的C回调中抛出异常?

这对我来说很难理解.

谢谢,Boda Cydo.

c c++ legacy callback

9
推荐指数
1
解决办法
995
查看次数

我如何创建一个最小的测试用例来说明/ EHs的成本?

当我将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 ++异常不会比我在交易中接受的运行时成本高。

是的,我知道一般性建议,不要让异常跨越模块边界或流经第三方C代码。是的,我还是这样做。是的,这在我们的项目中很好!

c++ exception visual-studio visual-studio-2019

5
推荐指数
1
解决办法
66
查看次数