有没有办法,没有在每个函数原型上放置一个属性,让gcc知道C函数永远不会传播异常,即内部声明的所有函数extern "C"都应该是__attribute__((nothrow))?理想的是-f样式命令行选项.
我无法找到迫使与申报功能标准的东西extern "C"是noexcept,无论是含蓄或明确.
但是,应该很清楚C调用约定不能支持异常......或者是它?
标准是否提到了这个,我错过了某个地方?如果没有,为什么不呢?它只是作为各种实现细节留下的吗?
我现在正在使用libjpeg来保存JPEG图像.如果有错误,libjpeg的默认行为是调用exit(),我想避免,因为它不是我的程序的致命错误.的libjpeg 可以让你使用你自己的错误管理器,并授权,如果您使用自己的error_exit()函数(调用exit()默认情况下),你必须不控制权返回给调用者.libjpeg建议使用setjmp.h来满足此要求而不是exit()程序.
但是,我正在编写一个C++程序,我可以访问异常.这个问题的答案表明从回调中抛出异常是安全的(如明确定义的行为).但它没有提到动态库,并且通常的经验法则是不要在动态库边界之间抛出异常.
这是一个例子:
#include <iostream>
#include <jpeglib.h>
#include <cstdio>
#include <stdexcept>
static void handleLibJpegFatalError(j_common_ptr cinfo)
{
(*cinfo->err->output_message)(cinfo);
throw std::runtime_error("error in libjpeg, check stderr");
}
int main()
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE* file = std::fopen("out.jpeg", "wb"); // assume this doesn't fail for this example
try
{
cinfo.err = jpeg_std_error(&jerr);
jerr.error_exit = handleLibJpegFatalError;
// let's say this triggers a fatal error …Run Code Online (Sandbox Code Playgroud) 有没有办法(编译器扩展是可接受的)包含 C 标头并将包含的 C 函数标记为noexcept,但不修改标头?
例如,我有一个 C 库及其头文件header.h。不会将任何 C++ 回调传递给它,因此它永远不会抛出异常。我可以将包含的 C 函数标记为noexcept或告诉编译器它们永远不会抛出异常,以便编译器不必生成未使用的代码并为调用者启用一些可能的优化吗?请注意,使用 C 库的 C++ 代码应该仍然能够使用异常(因此不能选择禁用整个程序的异常)。
extern "C" {
#include "header.h" // Is there a way to mark included C functions here as noexcept?
}
Run Code Online (Sandbox Code Playgroud)