22

WinSock2.h では無効なソケットとソケットエラーは次のように定義されていますか? これに何か意味はありますか?

#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)
4

6 に答える 6

38

むかし、ある寒い雨の日​​の早朝、ワシントン州シアトル郊外の風変わりではあるが成長を続ける霧深い緑に覆われた丘の真ん中に、赤レンガ造りの建物の小さいながらも広大な群れがありました。ますます多くのネットワーク ソフトウェア エンジニア、マネージャ、およびアーキテクトが集まっていた中規模の会議室。会議は十分に静かに始まり、ほとんどが男性グループが紅茶とコーヒーをすすり、メモ帳に走り書きしながらシャープペンシルを回したり、パーム パイロットを引っ掻いたりしていました (ニュートンを持っ男がいましたが、誰もが無視しました)。彼)。

発表者がソース コードをスクロールし続けると、5 人のソフトウェア アーキテクトのうちの 1 人に止められました。5 人のソフトウェア アーキテクトは、特にレビューに招待されていなかったにもかかわらず、とにかく現れました。「なに、あれは…」と、クリントン大統領のように指を振って、彼はうなずいた。司会者は立ち止まって指をじっと見つめていましたが、建築家が手を振り続けたときの指の小刻みな動きに、なんとなく魅了されたように感じました。「私は言った」と彼は繰り返し始めた。

発表者は画面を見上げましたが、何も問題はありませんでした。"あなたは何について話していますか?" 彼は尋ねた。

アーキテクトは眉を上げ、最初は驚愕を表し、次に憤慨し、次に便秘に変わり、「それは露骨なコーディング スタイル ガイドライン違反です!」と叫びました。

オブザーバーは、この問題が一体何なのか疑問に思いながら、彼らの間で囁き始めました。しかし、プレゼンターは不満 (2 番目の種類) で、すぐにフィードバックに感謝し、レビューを続けました。

「私は無視されません!」建築家は甲高い金切り声で叫び、突然立ち上がり、手のひらをテーブルの上に叩きつけました。

拳がテーブルを叩き、マネージャーが裏側を隠す方法を考案し始め、エンジニアが目次、索引、脚注、および参考文献を完備したコーディング スタイル マニュアルをめくり始めたとき、部屋は噴火しました。

発表者は外見上平静を保っていましたが、スノコルミーでのスキー旅行に行けるようにレビューを完成させたいと切望していたので、イライラしていました。「タイプミスマッチのことですか?」と彼はさりげなく尋ねた。

建築家は一瞬驚いたように見えたが、すぐに気を取り直し、「もちろんだ」と鼻を鳴らした。

プレゼンターは、「-1」の 2 文字を「~0」に置き換えて振り返りました。アーキテクトは変更を精査し、次に画面の残りの部分を精査し、メモを参照し、最後に腰を下ろしました。

レビューの残りの部分は問題ありませんでした。

于 2012-06-08T03:21:41.247 に答える
24

2 の補数システム (Windows は常に 2 の補数) では、~0は に等しいため-1、コンパイラにとっては意味がありません。

読者には重要な意味があるかもしれません:~0すべてのビットが設定された値である-1ことを強調し、0 よりも 1 小さい値であることを強調します。

余談:

2 の補数ではないシステムでSOCKET、それが符号なしの型であると仮定すると、一般に と書くのは間違っ(SOCKET)(~0)ています。その理由は、そのようなシステムで~0は、 は値 -1 を表さず、INT_MIN、負のゼロ、またはトラップ表現のいずれかだからです。したがって、必ずしもSOCKETすべてのビットがゼロの値として型に変換されるINT_MAX+2とは限り0ません。

そのため、通常は符号なしの型を で初期化し-1て、すべてのビットが設定された値を取得する必要があります。扱っている符号なしの型がわかっている場合は、、または、または同様のものを使用できます。しかし、すべての符号なしタイプで機能するため、それだけの価値はありません。UINT_MAX~0UL-1

于 2012-05-30T13:38:11.330 に答える
4

ほとんどの場合、それはだらしのないことです。-1 と ~0 は事実上同じものです。

ソケットは unsigned int であるため、~0 の方がより良いスタイルであると主張することもできますが、実際には実際には何の違いもありません。

彼らは "const unsigned" の代わりに "#define" を使用しているため、まだ奇妙に開かれています。例えば

    unsigned   a = SOCKET_ERROR;
    long long  b = a;
    if (b != SOCKET_ERROR)
        std::cout << "????\n";

一部の人々に驚きを与えるかもしれません。

于 2012-06-07T16:55:22.293 に答える
0

SOCKETは符号なしであるため、(-1)は使用できません。

于 2012-05-30T13:50:08.360 に答える
0

INVALID_SOCKETポインタである を返す関数に使用されSOCKETます ( a によく似ていますHANDLE)。32 ビット システムでは 32 ビット値になり、64 ビット システムでは 64 ビット値になります。

同等のサイズの整数に適切にキャストすると、 と同じになり-1ます。ただし、常に適切にキャストされると想定しない方がはるかに安全です。

于 2012-06-04T19:49:12.663 に答える