1

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

  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 语句的情况下工作,但现在我需要我的程序能够从不同来源获取数据。难道不能这样做吗?我认同。如果不是,有没有其他简单的方法可以得到我正在尝试的东西?

非常感谢。

4

8 回答 8

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. 
于 2010-03-21T18:19:38.303 回答
10

任何类型的括号都会使其超出范围,即使不是 for、while 或 if 之类的构造。

IE

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

此外,您可以将其三元化:

const unsigned char *packet = (mode == 0) ? read_serial_packet(src, &len) : read_network_packet(fd, &len);
于 2010-03-21T18:23:12.307 回答
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

您必须packet在 the 之前声明并根据您的条件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
于 2010-03-21T18:19:24.890 回答
3

这是因为花括号{ }创建了一个新的范围。这意味着在这些大括号之间定义的每个变量都是在一个范围内定义的,因此在它之外是不可见的。

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

const unsigned char *packet = 0;
if (mode == 0)
{
    packet = read_serial_packet(src, &len);
} 
else {
    packet = read_network_packet(fd, &len);
}
于 2010-03-21T18:21:32.650 回答
2

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

编辑:所以早点声明。

于 2010-03-21T18:18:44.860 回答
2

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

{
    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 
于 2010-03-21T18:19:51.460 回答
2

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

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

} else {
    packet = read_network_packet(fd, &len);
}
于 2010-03-21T18:19:53.890 回答
1

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

于 2010-03-21T18:19:38.800 回答