将在C++;根据现行标准,是否会导致未定义的行为? 我经常听到C++异常系统可以被禁用,因为你不应该为你不使用的东西付费。如果我选择编译我的C++程序,没有例外,它会导致未定义的行为吗?< P>当前(和将来)C++标准没有关闭异常的概念。所以从技术上说,是的,如果你问语言律师,这样做会导致未定义的行为。实际上,实现尝试为这个流行的扩展定义合理的行为。查阅您的文档。

将在C++;根据现行标准,是否会导致未定义的行为? 我经常听到C++异常系统可以被禁用,因为你不应该为你不使用的东西付费。如果我选择编译我的C++程序,没有例外,它会导致未定义的行为吗?< P>当前(和将来)C++标准没有关闭异常的概念。所以从技术上说,是的,如果你问语言律师,这样做会导致未定义的行为。实际上,实现尝试为这个流行的扩展定义合理的行为。查阅您的文档。,c++,exception,C++,Exception,以补充Howard的答案 一般的问题是,如果关闭异常,在编写时考虑到异常的代码可能会突然变得bug重重 例如,如果无法满足内存请求,对new的简单调用应该抛出std::bad_alloc异常。如果您关闭了异常,它将返回0:您确定对new的所有调用都检查返回是否为0?即使是标准库或第三方库中的库 CLAN最近引入了一个诊断,它可以防止编译时如果 > 尝试< >在编译时禁用异常,因为这意味着代码没有被适当地准备,但我不确定WRT其他编译器,所以请小心。至少有几个C++编译器我已经使用过了。(VC

以补充Howard的答案

一般的问题是,如果关闭异常,在编写时考虑到异常的代码可能会突然变得bug重重

例如,如果无法满足内存请求,对
new
的简单调用应该
抛出
std::bad_alloc
异常。如果您关闭了异常,它将返回
0
:您确定对
new
的所有调用都检查返回是否为
0
?即使是标准库或第三方库中的库


CLAN最近引入了一个诊断,它可以防止编译时如果<代码> > <代码>尝试< <代码> >在编译时禁用异常,因为这意味着代码没有被适当地准备,但我不确定WRT其他编译器,所以请小心。

至少有几个C++编译器我已经使用过了。(VC、GNU、GreenHills、Tasking),当异常被禁用时抛出异常(因为您将异常与无异常代码链接在一起)最坏的情况是在异常代码的调用堆栈中间夹一个异常代码,在这种情况下,任何一个异常代码都不会被清除,但是你会得到一个看似工作的异常。CRT将被编译为启用了异常。所以你会发现你不能真正关闭异常,除非Y。您不使用CRT,或者至少不使用CRT中可能引发异常的部分。同意,它“导致未定义的行为”,就像使用
long
或线程“导致未定义的行为”一样。未被标准定义,但如果您的实现记录了执行此操作的命令行选项,则实现可能至少尝试定义结果行为。您必须了解对实现的影响。按照难度顺序,请了解从
long
(最简单)到线程的运行过程尼尔(C++):C(C++)标准库,但这些部分不是普遍需要的。“是的,我指的是C++运行时库。我用的编译器不区分这两个;C程序只链接到同一个库。(但显然没有使用例外的部件)为什么你认为如果你不使用异常,你就要付出代价?除非抛出异常,否则通常要付出的代价很小。“CoDy:一般来说,C++代码中,即使你不使用异常,也会花费你一点点,因为没有完整的程序优化,每个TU必须假定其他TU可能。作为堆栈展开的一部分,为自动变量调用析构函数所需的代码并不庞大(而且在严肃的编译器上,没有什么比在运行时设置异常帧的幼稚方法更为重要),但据我所知,如果只需要在干净的返回上调用析构函数,那么它就有一点点更多。比较代码大小……当然,通常成本可以忽略不计,但“很少”仍然是“有意义的”@史提夫:公平的说。C++不是我的主要语言,所以这很好。但是,你不会在整个程序优化的时候编译你的软件版本,这会降低成本吗?我想问题是使用一个你没有源码的库,但是你不能关闭Excel。首先,这似乎是一个没有实际意义的问题。@Cody:这取决于编译器是否有任何完整的程序优化以及它们的作用。我并不是说有了它们,开销就消失了,而不需要指定选项,只是没有它们,你就没有机会了。我想在你描述的情况下,有一种可能性是你有一个TU包装“危险”库并捕获所有内容,其余代码根本不使用异常。原则上,优化器可能会推断另一个TU不需要异常处理,但在实践中,如果您在意,您将指定它以确保。