详解警告“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 
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”

你可能感兴趣的:(珠玑小技)