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

时间:2010-03-21 18:16:31

标签: 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);
  }

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

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

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

非常感谢。

8 个答案:

答案 0 :(得分: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. 

答案 1 :(得分:9)

任何类型的括号都会将其置于范围之外,即使不是像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);

答案 2 :(得分: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之前声明if,并根据您的条件在ifelse分配:{/ p>

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

答案 3 :(得分:3)

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

要使其正常工作,您需要在if-else:

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

答案 4 :(得分:2)

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

编辑:所以早点宣布。

答案 5 :(得分: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 

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:1)

if语句子句中的指针声明将其范围扩展到if语句的末尾。你应该在if语句之外声明你的指针并在里面进行赋值。