奇妙な構文による「非ソケットのソケット操作」エラー
質問
エラーを駆け抜けました 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) {
所属していません StackOverflow