我有一个指向函数的指针。我想:
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语句,但现在我需要我的程序能够从不同的来源获取数据。这样做不可能吗?我认同。如果不是,有没有其他简单的方法来获得我正在尝试的东西?
非常感谢。
答案 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
,并根据您的条件在if
和else
分配:{/ 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语句之外声明你的指针并在里面进行赋值。