投掷和共享对象的可见性

Visibility with throw and shared objects

本文关键字:可见性 对象 共享      更新时间:2023-10-16

我正在将一段代码从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(...)作为异常规范是不合法的c++。

我只能假设你遇到了微软的可憎的扩展。

你需要删除它。在任何情况下,唯一有意义的异常说明符是nothrow(如果你使用的是古老的编译器,则是throw())。

事实上,这是确凿的证据:

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

建议弃用:

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