C
GNU C (Linux) 使用__THROW
宏而不是__MINGW_NOTHROW
. 虽然 MinGW 仅是__nothrow__
属性,但也__THROW
包含__leaf__
属性。
C++
如果使用 C++,__THROW
则有另外一种含义:throw()
- 表示不抛出异常(类似于__nothrow__
; 但在 C++ 标准中定义)。
所以这取决于你是用 C 还是 C++编译,而不是你从什么调用函数(仅限 GNU C / C++!)。
例子:
void f() __THROW;
像...一样对待 ...
GNU C:
void f() __attribute__((__nothrow__, __leaf__))
GNU C++:
void f() throw()
功能1)是取消点,
因此未标记__THROW
:
open()
read()
write()
close()
connect()
send()
recv()
close()
sendto()
recvfrom()
功能1) 标有__THROW
:
至少,这些都保存到__nothrow__
.
相比之下,MinGW 并没有将C 与 C++ 区别开来。在这两种情况下,都设置了属性。
使用上面的示例,__nothrow__
在 C和C++ 上设置:
void f() __attribute((__nothrow__))
功能1) 未标记__MINGW_NOTHROW
:
socket()
connect()
send()
recv()
closesocket()
sendto()
recvfrom()
CreateFile()
GetCommState()
SetCommTimeouts()
ReadFile()
WriteFile()
CloseHandle()
简而言之:没有!
兼容性
与 C
期望与 C++ 互操作的 C 语言代码应使用 -fexceptions 进行编译。这将使调试作为 C++ 引发的堆栈展开的一部分调用的 C 语言函数成为可能。
特别是,展开到没有异常处理数据的帧将导致运行时中止。如果展开器在找到处理程序之前用完展开信息,则调用 std::terminate()。
请注意,大多数开发环境都应该注意正确获取这些细节。对于 GNU 系统,GNU C 库的所有适当部分都已使用 -fexceptions 进行编译。
(来源: http: //gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html)
因此编译时-fexceptions
不需要等效属性。如果您只能标记您必须/应该使用的特定功能__nothrow__
。
但是,虽然使用__nothrow__
属性看起来只在 GNU C++ 上保存,并且在 Linux 上使用 GNU C 的一些功能,但在 Windows 上并不那么清楚。
附录:
为了避免这个问题的某些部分,我编写了一个类似于__THROW
但也可以在 MinGW 上使用的宏:
#if defined __GNUC__
#ifndef __THROW
#ifdef __cplusplus
#define __THROW throw()
#else
#define __THROW __attribute__((__nothrow__))
#endif
#endif
#else
#define __THROW
#endif
注: __leaf__
不包括在内。
1) 只谈论我的问题中列出的那些。