質問

エラーを駆け抜けました Socket operation on non-socket 呼び出し時のネットワーキングコードの一部 connect 何が原因であるかを理解しようとして、多くの時間を費やしました。私はついに、次のコード行が問題を引き起こしていることを理解しました。

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {

問題がわかりますか?これがラインがどのように見えるべきかです:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

私が理解していないのは、最初の誤った行が警告を発生させない理由です。別の言い方をすれば、一般的な形ではありません。

if ( foo = bar() < baz ) do_something();

特に走っているコンパイラには奇妙に見えます g++ -Wall -Wextra?

そうでない場合は、少なくともcppcheckに「悪いスタイル」として表示されるべきではありません。これはコンパイルの一部としても実行されていますか?

役に立ちましたか?

解決

実際、二重の括弧のために警告はありません (.

1つのペアを削除してみると、警告が取り戻されます。

#include <iostream>

int foo()
{
    return 2;
}

int main(int /*argc*/, char** /*argv*/)
{
    int l;

    if ((l = foo() < 3)) // Won't generate warning under gcc
    {
    }

    if (l = foo() < 3) // will generate a warning "warning: suggest parentheses around assignment used as truth value"
    {
    }

    return EXIT_SUCCESS;
}

このような迷惑な間違い/タイプミスを避けるために、私は同じステートメントで値を割り当ててテストすることを避けます。それはあまりにも多くのエラーが発生しやすいです。

他のヒント

それが、私が1つの声明であまり多くのことをしないようにしている理由の1つです。それ以外の

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

なぜだめですか:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top