C: Невозможно объявить указатель внутри оператора if - PullRequest
1 голос
/ 21 марта 2010

У меня есть указатель, который указывает на функцию. Я хотел бы:

  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 ]

16 голосов
/ 21 марта 2010

Вам необходимо пересмотреть понятие блоков или составных операторов или переменной области действия.

Если вы объявите переменную в составном операторе ({, }), переменная будет объявлена ​​только в этой конкретной области.

Таким образом, измените свой код на

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. 
9 голосов
/ 21 марта 2010

Любой вид скобок выведет его из области видимости, даже если это не конструкция, подобная для, while или if.

т.е.:

const unsigned char *packet = (mode == 0) ? read_serial_packet(src, &len) : read_network_packet(fd, &len);
7 голосов
/ 21 марта 2010

Переменные, объявленные в блоке, не видны вне его.

  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 и назначить его в if и else в соответствии с вашими условиями:

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 голосов
/ 21 марта 2010

Это потому, что фигурные скобки { } создают новую область видимости. Это означает, что каждая переменная, определенная между этими фигурными скобками, определена в области видимости и, следовательно, не видна за ее пределами.

Чтобы это работало, вам нужно определить *packet перед if-else:

const unsigned char *packet = 0;
if (mode == 0)
{
    packet = read_serial_packet(src, &len);
} 
else {
    packet = read_network_packet(fd, &len);
}
2 голосов
/ 21 марта 2010

Объявите указатель перед оператором if как:

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

} else {
    packet = read_network_packet(fd, &len);
}
2 голосов
/ 21 марта 2010

Когда вы определяете переменную, вы можете использовать ее только в определенной области.

{
    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 
2 голосов
/ 21 марта 2010

Вы не можете объявлять переменные внутри оператора if, а затем использовать их позже по той простой причине, что это может быть несуществующее место в памяти для некоторых путей в программе.

РЕДАКТИРОВАТЬ: Так объявите это раньше.

1 голос
/ 21 марта 2010

Объявление указателя внутри оператора if ограничивает его до конца оператора if.Вы должны объявить свой указатель вне оператора if и выполнить присвоение внутри.

...