Hier ist mein Code:
#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;
}
was gut kompiliert.
Wenn ich jedoch diese Zeile auskommentiere:
//ptr = (struct sockaddr_in *) res->ai_addr;
Ich werde bekommen:
$ gcc ex4.c
ex4.c:30:9: error: expected expression
struct sockaddr_in *sockAddrIn = (struct sockaddr_in *) res->ai_addr;
^
1 error generated.
Was vermisse ich?
case
(ohne umgebende geschweifte Klammern, wie in der oberen Antwort vorgeschlagen), ist eine schlechte Idee, da der Name der Variablen in späterencase
s sichtbar ist, aber nicht initialisiert wird (es sei denn, Sie haben ihn fallen gelassen).Antworten:
Jeder Fall in einer switch-Anweisung ist technisch gesehen ein Label. Aus obskuren und alten Gründen dürfen Sie keine Variablendeklaration als erste Zeile nach einem Label haben. Durch Auskommentieren der Aufgabe
die Linie
wird die erste Zeile nach dem Etikett,
AF_INET:
was, wie gesagt, in C illegal ist.Die Lösung besteht darin, alle Ihre Fallaussagen wie folgt in geschweifte Klammern zu setzen:
Jedenfalls denke ich, dass dies eine bessere Codierungspraxis ist.
quelle
Als Ergänzung zur akzeptierten Antwort können Sie Ihre Variablen vor den Fallbezeichnungen deklarieren.
Oder verwenden Sie einfach eine leere Anweisung.
quelle