【问题标题】:Declaration of void abort() throws different exceptionsvoid abort() 的声明抛出不同的异常
【发布时间】:2011-11-14 13:43:42
【问题描述】:

我正在尝试为 Festival 编写一些 C++ 代码(使用 C++ API),但在尝试编译时遇到了问题。这是我调用g++的方式:

g++ -Wall -pedantic -I../ -I../speech_tools/include/ helloFestival.C -o h -L../festival/src/lib/libFestival.a -L../speech_tools/lib/libestools.a -L../speech_tools/lib/libestbase.a -L../speech_tools/lib/libeststrings.a |& tee festival.runLog 我得到的错误是:

In file included from ../speech_tools/include/EST.h:48,
                 from ../festival/src/include/festival.h:47,
                 from helloFestival.C:4:
../speech_tools/include/EST_String.h:50: error: declaration of ‘void abort()’ throws different exceptions
/usr/include/stdlib.h:513: error: from previous declaration ‘void abort() throw ()’

EST_String.h 中的违规行是:
extern "C" void abort(void);

我使用的main()函数可以在这里找到:festvox.org/docs/manual-1.4.3/festival_28.html#SEC133

这里给出的编译和链接说明是我用过的。

我在网上看过这个问题,一些解决方案表明它可能是因为向后兼容性,或者从析构函数中调用 abort() 等。我的问题是:

  1. 如何摆脱这种情况?
  2. 为什么我会看到这个错误?

【问题讨论】:

  • 你能创建一个最小的例子吗?
  • 这很好,22。我想你可以做到extern "C" void abort(void) throw();?这将是一个有趣的悖论,因为 C 不知道异常
  • @VJo:我使用的示例可以在这里:festvox.org/docs/manual-1.4.3/festival_28.html#SEC133 - main() 功能与页面上的相同。链接和编译说明也可以在上面找到。
  • @sehe:这就是我在遇到一些帖子后尝试的,这些帖子说abort() 的原始定义会抛出,而这不会。这也不起作用,我以undefined reference to 结束错误。

标签: c++ abort throw festival


【解决方案1】:

您看到此错误是因为 speech_tools 中的 abort() 函数与标准强制 abort() 函数冲突。可能没有真正好的、干净的方法来解决这个问题。如果您自己编写了 EST_String.h,请以不同的方式命名函数。

如果不是,请不要在同一个文件中包含 stdlib.h 和 EST_String.h。是的,这是有限制的,而且很糟糕,但你现在的处境很糟糕。

【讨论】:

  • 你在说什么?什么是语音工具?
  • 头文件“../speech_tools/include/EST_String.h”。
  • @thiton:EST_String.h 随发行版一起提供。它是 Festival 的 C++ API 的一部分。另外,stdlib.h默认不包含在上述文件中。
【解决方案2】:

这是一个非常基本的 c 错误。中止的两个定义是冲突的,我会尝试删除 EST_String.h 中的行,并可能添加一个 #include <stdlib.h> 并查看它是否在此之后编译。

【讨论】:

  • 不。在EST_String.h 中评论该行并包括stdlib.h 删除了该行,但引入了一大堆其他undefined reference to 错误。 EST_String.h 是节日发行版附带的文件。
【解决方案3】:

我不认为包含 stdlib 标头是问题所在。但是,将 either <cstdlib> <stdlib.h> 作为翻译单元中的第一个标题,您可能会获得更好的效果

理由:以防万一<cstdlib> 中的定义添加了 no-throw declspec。

所以我真的建议......只是摆弄那个。如果这两种方式都不起作用(确保您没有冲突的包含或过时的预编译头文件),我建议只删除 EST_String.h 中的违规声明

【讨论】:

  • 您能否在including either or as the ... 部分编辑您的答案?我认为您在评论中在这里写了一些东西,但可能不小心被遗漏了。
  • 添加#include <stdlib.h>#include <cstdlib.h> 作为文件中的第一个标题不会对错误消息产生任何影响。
  • @Sriram:当然我的意思是完全“添加”。添加它只会确保声明冲突。我的赌注是从EST_String.h 中删除声明,因为它在那里确实没有任何业务:它属于系统头文件(stdlib.h/cstdlib)
  • 好的。那么这是否意味着我在header中改变了一些东西之后,我需要重新编译Festival或者至少“speech_tools”,也就是这个header所在的项目?
  • 没有。              
【解决方案4】:

今天这仍然是一个问题。作为一种解决方法,我正在使用这段代码。 它既丑陋又老套,但可以正常工作:

extern "C" void abort_est() { abort(); }
#define abort abort_est
#include <festival.h>
#undef abort

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多