【问题标题】:Visibility with throw and shared objectsthrow 和共享对象的可见性
【发布时间】:2016-05-13 14:13:21
【问题描述】:

我正在将代码从 Windows 移植到 CentOS,但我遇到了一个我以前从未见过的问题。

鉴于该函数声明(还有更多):

byte getValueInt8() const throw(.../*Exception*/);

我收到此错误:

error: expected type-specifier before ‘...’ token unsigned short getValueInt8() const throw(.../*Exception*/);

当然,我检查了互联网,发现这是共享对象中的可见性问题。

此网站https://gcc.gnu.org/wiki/Visibility 解释了这一点,但我在阅读时已经这样做了。

我的定义是:

#if defined(_MSC_VER)
#include <winsock2.h>
   #ifdef MFTINTERFACE_EXPORTS
      #define EXPORT_IMPORT __declspec(dllexport)
   #else
      #define EXPORT_IMPORT __declspec(dllimport)
   #endif
#elif defined(_GCC)
   #include <arpa/inet.h>
   #include "CmnSocketsDef.h"
   #include "CmnDefs.h"
   #define EXPORT_IMPORT __attribute__((visibility("default")))   
#else
   #define EXPORT_IMPORT
   #define IMPORT
   #pragma warning Unknown dynamic link import/EXPORT_IMPORT semantics.
#endif

当然,所有 EXPORT_IMPORT 都在我的代码中设置好了。

修改前的代码在 Windows 中编译。

【问题讨论】:

  • throw(...) 表示该函数可以抛出any异常。这类似于根本没有异常规范。

标签: c++ object visibility shared throw


【解决方案1】:

throw(...) 作为异常规范在 c++ 中是不合法的。

我只能假设您遇到过 Microsoft abomination 扩展。

您需要将其删除。无论如何,在现实中唯一有意义的异常说明符是nothrow(如果您使用的是古老的编译器,则为throw())。

确实,这是确凿的证据:

https://msdn.microsoft.com/en-us/library/wfa0edys.aspx

建议弃用:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3051.html

【讨论】:

  • 好的,非常感谢!然后我删除所有这些抛出!
  • @Render 是的,删除所有throw(...) 语句。留下throw() ,因为他们要求函数不能抛出任何东西。您可以将这些转换为 nothrow,因为 throw() 已弃用。
  • 其实我不会。我刚刚看到不同的文件在“...”之后还有除 /*Exception*/ 之外的其他信息。这是一种结构类型,所以我把它扔了。我刚刚修改了一段代码,它可以工作
  • @Render。如果您取消注释 Exception,您就是在告诉编译器该函数保证不会抛出除 Exception 之外的任何内容。如果是,程序将abort()。实际上最好完全删除异常规范。它们已被弃用,因为将它们放入 c++ 标准是错误的。 open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3051.html
  • 异常是一个结构,里面有一个消息字符串。这些异常通过“try catch”处理,并在 catch 中返回 false。无论如何都会调用abort() 吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 2019-12-23
  • 2010-12-31
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2023-03-08
  • 2021-07-27
相关资源
最近更新 更多