[解決済み] Switch-caseが未使用行をコメントアウトした後にコンパイルされない
2023-06-26 05:25:35
質問
以下は私のコードです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main (void) {
struct addrinfo hints;
memset (&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_CANONNAME;
struct addrinfo *res;
getaddrinfo ("example.com", "http", &hints, &res);
printf ("Host: %s\n", "example.com");
void *ptr;
while (res != NULL) {
printf("AI Family for current addrinfo: %i\n", res->ai_family);
switch (res->ai_family) {
case AF_INET:
ptr = (struct sockaddr_in *) res->ai_addr;
struct sockaddr_in *sockAddrIn = (struct sockaddr_in *) res->ai_addr;
break;
}
res = res->ai_next;
}
return 0;
}
で、うまくコンパイルできます。
しかし、この行をコメントアウトすると
//ptr = (struct sockaddr_in *) res->ai_addr;
もらう。
$ gcc ex4.c
ex4.c:30:9: error: expected expression
struct sockaddr_in *sockAddrIn = (struct sockaddr_in *) res->ai_addr;
^
1 error generated.
何が足りないのでしょうか?
どのように解決するのですか?
switch文の各ケースは、技術的に言えばラベルです。いくつかの 曖昧で古い理由 のため、ラベルの後の最初の行に変数宣言を記述することはできません。代入をコメントアウトすることで
ptr = (struct sockaddr_in *) res->ai_addr;
行
struct sockaddr_in *sockAddrIn = (struct sockaddr_in *) res->ai_addr;
はラベルの後の最初の行になります
AF_INET:
のようになり、これはC言語では違法です。
解決策は、すべてのcase文をこのように中括弧で囲むことです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main (void) {
struct addrinfo hints;
memset (&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_CANONNAME;
struct addrinfo *res;
getaddrinfo ("example.com", "http", &hints, &res);
printf ("Host: %s\n", "example.com");
void *ptr;
while (res != NULL) {
printf("AI Family for current addrinfo: %i\n", res->ai_family);
switch (res->ai_family) {
case AF_INET:
{
ptr = (struct sockaddr_in *) res->ai_addr;
struct sockaddr_in *sockAddrIn = (struct sockaddr_in *) res->ai_addr;
break;
}
}
res = res->ai_next;
}
return 0;
}
とにかく、この方が良いコーディングのやり方だと思います。
関連
-
C++の配列コピー
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み】switch-caseの有効な、しかし無価値な構文?
-
[解決済み】Switch文:defaultは最後のケースでなければならない?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?