Lig*_*ica 23 c c++ language-lawyer noexcept c++11
我无法找到迫使与申报功能标准的东西extern "C"是noexcept,无论是含蓄或明确.
但是,应该很清楚C调用约定不能支持异常......或者是它?
标准是否提到了这个,我错过了某个地方?如果没有,为什么不呢?它只是作为各种实现细节留下的吗?
Mar*_*wen 18
据我所知,不能保证用"C"链接定义的函数不会抛出异常.该标准允许C++程序调用具有"C"语言链接的外部函数,并定义用C++编写的具有"C"语言链接的函数.因此,没有什么可以阻止C++程序调用具有"C"语言链接的函数,该函数实际上是用C++编写的(在另一个编译单元中可能,尽管这不是必需的).这样做会很奇怪,但很难排除.此外,我没有看到标准中的哪个位置表示这样做会导致未定义的行为(事实上,因为标准不能定义不是用C++编写的函数行为,所以这将是没有正式未定义行为的唯一用法).
因此,我认为假设"C"连接暗示是错误的noexcept.
嗯,我假设extern "C"只使用C-linkage,而不是C函数.它可以防止编译器进行C++名称修改.
更直接 - 假设这段代码.
// foo.cpp
extern "C" void foo()
{
throw 1;
}
// bar.cpp
extern "C" void foo();
void bar()
{
try
{
foo();
}
catch (int)
{
// yeah!
}
}
Run Code Online (Sandbox Code Playgroud)