C:不能在if语句中声明指针

ech*_*nzo 1 c conditional lexical-scope

我有一个指向函数的指针.我想要:

  if (mode == 0)
  {
  const unsigned char *packet = read_serial_packet(src, &len);

  } else {
  const unsigned char *packet = read_network_packet(fd, &len);
  }
Run Code Online (Sandbox Code Playgroud)

但我不能这样做,因为我的编译器在我稍后在代码中使用指针时会抱怨.

   error: 'packet' undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

这很奇怪.它没有if语句,但现在我需要我的程序能够从不同的来源获取数据.这样做不可能吗?我认同.如果不是,还有其他简单的方法来获得我正在尝试的东西吗?

非常感谢.

mne*_*syn 16

您需要检查复合语句或变量范围的概念.

如果在复合语句({,})中声明变量,则仅在该精确范围内声明该变量.

因此,将代码更改为

const unsigned char *packet = NULL;
if (mode == 0)
{
   packet = read_serial_packet(src, &len);
} else {
   packet = read_network_packet(fd, &len);
}

// Now you can perform operations on packet. 
Run Code Online (Sandbox Code Playgroud)


y2k*_*y2k 10

任何类型的括号都会将其置于范围之外,即使不是像for,while或if这样的构造.

{
    int num = 2;
}
num++; // error: out of scope!
Run Code Online (Sandbox Code Playgroud)

此外,你可以只是三元组:

const unsigned char *packet = (mode == 0) ? read_serial_packet(src, &len) : read_network_packet(fd, &len);
Run Code Online (Sandbox Code Playgroud)


Eli*_*sky 7

在块外声明的变量不在其外部.

  if (mode == 0)
  {
    const unsigned char *packet = read_serial_packet(src, &len);
    // packet can be used here
  } else {
    const unsigned char *packet = read_network_packet(fd, &len);
    // packet can be used here
  }

  // packet can not be used here
Run Code Online (Sandbox Code Playgroud)

您必须packet在申请之前申报并根据您的条件if分配:ifelse

const unsigned char *packet;

if (mode == 0)
{
  packet = read_serial_packet(src, &len);
}
else
{
  packet = read_network_packet(fd, &len);
}

// packet can be used here
Run Code Online (Sandbox Code Playgroud)