2011-10-28 2 views
2

タイトルはすべてそれを言う。 <csetjmp>を含むと、longjmpjmp_bufstd名前空間に含まれますが、setjmpは含まれません。 MinGW4.5とMSVC10でこれを確認しました。 <csetjmp>ヘッダーを調べた後、私はこの選択の理由を理解できませんでした。私は常に<cheader>ファイルが<header.h>をネームスペースstdにラップしていると仮定していました。<csetjmp>を含めると、std名前空間でsetjmpが使用されないのはなぜですか?

私は間違っていますか? setjmp特別なケースの背後にある根拠は何ですか?私を教えてください!

注:私は、C++でsetjmp/longjmpを誤って使用している問題を認識しています。

+0

'sigsetjmp()'が優先されますか? – sarnold

+0

いいえ、私はの後にstd名前空間の内側と外側のどちらも利用できないsigsetjmpを持っていません。 – overcoder

+0

これを無効にするには、うまくいきます。しかし、マクロには名前空間のスコープがありません。 –

答えて

3

setjmpマクロとして実装することができるので、C++標準では、これは、17.6.1.2 [ヘッダー]に述べている: のマクロとして定義されなければならないCのマクロとして定義され

名たとえCが実装のためにライセンスを付与したとしても、C++の標準ライブラリである を関数として扱います。 [注:Cのマクロとして定義されている名前は、assert,offsetof,setjmp,va_arg,va_endva_startに続く を含みます。 -end note]

つまり、マクロです。

+0

ありがとう!しかし、このようなエイリアスを定義することはできません: '#define std :: setjmp setjmp'? – overcoder

+2

@overcoder、no。これは適切なマクロではありません。 – MSN

+1

@overcoder:マクロ名には単一の識別子しか指定できないため、これは不可能です。 –