繁体   English   中英

C:无法在if语句中声明指针

[英]C: Cannot declare pointer inside if statement

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

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

  } else {
  const unsigned char *packet = read_network_packet(fd, &len);
  }

但是我不能这样做,因为在以后的代码中第一次使用指针时,编译器会抱怨。

   error: 'packet' undeclared (first use in this function)

这很奇怪。 它没有if语句就可以工作,但是现在我需要我的程序能够从不同来源获取数据。 这有可能吗? 我认同。 如果不是,还有其他简单的方法可以得到我想要的东西吗?

非常感谢。

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

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

因此,将您的代码更改为

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. 

任何形式的括号都将使它超出范围,即使不是诸如for,while或if这样的构造。

{
    int num = 2;
}
num++; // error: out of scope!

另外,您可以只进行三元处理:

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

在块外声明的变量看不到。

  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

您必须在if之前声明packet ,并根据您的条件在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

这是因为花括号{ }产生了新作用域。 这意味着在这些括号之间定义的每个变量都在一个范围内定义,因此在该范围之外不可见。

要使其工作,您需要在if-else之前定义*packet

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

您不能在if语句中声明变量,然后在以后使用它们,原因很简单,因为对于程序中的某些路径,这将是不存在的内存位置。

编辑:所以早点声明。

定义变量时,只能在定义的范围内使用它。

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

    // packet goes out of scope when the block ends
} 

因此,您需要将定义移至所需的最大范围:

{
    const unsigned char *packet;

    {
        packet = read_serial_packet(src, &len);

    }

    // packet still in scope here

}

// and packet is no longer in scope here 

在if语句之前将指针声明为:

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

} else {
    packet = read_network_packet(fd, &len);
}

if语句子句中指针的声明将其范围限定在if语句的末尾。 您应该在if语句外部声明指针,并在内部进行赋值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM