void abort()的声明引发不同的异常 我试图编写一些代码> C++ >代码>(使用C++ API),用于节日>代码>,在编译时卡住了。下面是我如何调用g++:
void abort()的声明引发不同的异常 我试图编写一些代码> C++ >代码>(使用C++ API),用于节日>代码>,在编译时卡住了。下面是我如何调用g++:,c++,abort,throw,festival,C++,Abort,Throw,Festival,g++-Wall-pedantic-I../-I../speech\u tools/include/helloFestival.C-o h-L../festival/src/lib/libFestival.a-L../speech\u tools/lib/libestools.a-L../libestbase.a-L../speech\u tools/lib/libeststrings.a|&tee festival.runLog 我得到的错误是: In file included from .
g++-Wall-pedantic-I../-I../speech\u tools/include/helloFestival.C-o h-L../festival/src/lib/libFestival.a-L../speech\u tools/lib/libestools.a-L../libestbase.a-L../speech\u 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)代码>
我使用的main()
函数可以在这里找到:festvox.org/docs/manual-1.4.3/festivalu 28.html#SEC133
这里给出的编译和链接说明就是我使用过的
我在网上看到过这个问题,一些解决方案表明这可能是因为向后兼容,或者从析构函数中调用abort()等等。我的问题是:
我怎样才能摆脱这个
为什么我会看到这个错误李>
这是一个非常基本的c错误。中止的两个定义相互冲突。我将尝试删除EST_String.h
中的行,并可能添加一个#include
,然后查看它是否编译。您会看到此错误,因为speech_tools中的abort()函数与标准的强制中止()函数冲突。可能没有真正好的、干净的方法来解决这个问题。如果您自己编写了EST_String.h,请以不同的方式命名函数
如果没有,请不要将stdlib.h和EST_String.h包含在同一文件中。是的,这是限制性的,而且很糟糕,但是您现在的处境很糟糕。我认为包括stdlib头不是问题所在。但是,如果将
或
作为翻译单位的第一个标题,您可能会获得更好的里程数
理由:以防万一,
中的定义添加了无抛出declspec
所以我真的建议。。。随便摆弄吧。如果这两种方法都不起作用(确保没有冲突的include或过时的预编译头),我建议只删除EST_String.h中有问题的declarion,这在今天仍然是个问题。作为解决方法,我使用这段代码。
它又丑又黑,但能正常工作:
extern "C" void abort_est() { abort(); }
#define abort abort_est
#include <festival.h>
#undef abort
extern“C”void abort_est(){abort();}
#定义中止中止
#包括
#取消终止
你能举一个简单的例子吗?这很好,而且是第22条军规。我想你可以让它extern“C”void abort(void)throw()代码>?这将是一个有趣的悖论,因为C不知道exceptions@VJo:这里可以看到我使用的示例:-函数main()
与页面上的函数相同。链接和编译说明也可以在上面找到。@sehe:这就是我在看到一些帖子后所做的尝试,这些帖子说,abort()
的原始定义会抛出,而这不会。。这也不起作用,我以对
errors.nope的未定义引用结束。在EST_String.h
中注释该行并包括stdlib.h
删除了该行,但引入了大量其他未定义的错误引用EST_String.h
是节日发行版附带的文件。你在说什么?什么是语音工具?头文件“./speech\u tools/include/EST\u String.h”。@thiton:EST\u String.h随发行版提供。它是节日的C++ API的一部分。另外,默认情况下,stdlib.h
不包含在上述文件中。您能否在中编辑您的答案,包括或作为…
部分?我想你在评论中写了一些东西,但可能是不小心漏掉了。添加#include
或#include
作为文件中的第一个头并不会对错误消息产生任何影响。@Sriram:当然,我的意思是排他性的。不是“添加”。添加它只会确保声明冲突。我的赌注是从EST_String.h
中删除声明,因为它在那里没有任何业务:它属于系统头(stdlib.h/cstdlib)OK。那么,这是否意味着在我更改了标题中的某些内容之后,我需要重新编译Festival或至少“speech_tools”,这是标题所在的项目?否。