ハ
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++ に違いはありません。どちらの場合も属性が設定されます。
上記の例を使用すると、CおよびC++__nothrow__
で設定されます。
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) 私の質問にリストされているものについてのみ話します。