详解警告“unreferenced local variable”

在编译C++程序时,我们有时候遇到这样的警告
warning C4101: 'x1' : unreferenced local variable

下面是一个会出现上述警告的简单例子:

using namespace std;
class X
{};
int main()
{
	int i;
	cin >> i;
	if(i)
	{
		X a;
	}
	return 1;
}
接下来是一个稍微复杂点的例子:

#include <iostream>
using namespace std;
class X
{};

void f(int i)
{
	if(i<10)
		goto jump1;
	X x1;
jump1:
	switch(i)
	{
	case 1: X x2; break;
	case 2: X x3; break;
	}
}

int main()
{
	f(1);
	return 1;
}

这个程序会给出如下警告信息:

 : warning C4101: 'x1' : unreferenced local variable
 : warning C4101: 'x2' : unreferenced local variable
 : warning C4101: 'x3' : unreferenced local variable


我们的程序没有逻辑错误,为什么编译器会给出这样的警告信息呢?这个警告信息是在提示什么呢?这是很多人可能会疑问的


原因剖析:
       在C99之前,C语言要求要求必须在一个程序块的左括号一开始就定义好所有的变量,所有C编译器会在程序块的开头就分配了所有的内存,所以C++编译器也延续了这样的处理方式,程序块的开头就分配所有的内存,但虽然变量的空间已经分配好了,在变量定义(构造函数被调用)之前我们还是无法访问这块存储空间的(即该对象)
        在上述的代码中,if\switch\goto语句都有可能导致跳过构造函数调用的序列点,这会导致为某个变量分配了内存空间,但最终变量却没有定义(初始化),编译器为了保证“产生”的对象都会被初始化,就给出了警告信息“unreferenced local variable”

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值