这是我的代码:

#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;
}

这很好.

然而,当我 comments 这句话时:

//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语句中的每个 case 都是一个标签.对于大约obscure and old reasons个标签,不允许将变量声明作为标签后的第一行.通过注释掉作业(job)

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++相关问答推荐

C中char数组指针的问题

我可以动态分配具有空类型函数的矩阵吗?

无效使用未定义类型'structsquare'?

与unions 的未定义行为

为什么复合文字(C99)的返回会生成更多的汇编代码?

如何在Visual Studio代码中关闭此函数名称显示功能?

空指针的运行时强制转换

不会停在空格或换行符上的错误

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

Flose()在Docker容器中抛出段错误

Kdb:仅升级指定的列

在每种If-Else情况下执行语句的最佳方式

从uint8_t*转换为char*可接受

如何在POSIX-UEFI中获得输入?

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

合并对 struct 数组进行排序

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

Struct 内的数组赋值