[英]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
,并根据您的条件在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
这是因为花括号{ }
产生了新作用域。 这意味着在这些括号之间定义的每个变量都在一个范围内定义,因此在该范围之外不可见。
要使其工作,您需要在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.