C++ c++;:何时初始化声明的变量而不将其赋值?
如果我编译下面的代码作为注释第13行,我会收到一条警告消息,它说C++ c++;:何时初始化声明的变量而不将其赋值?,c++,C++,如果我编译下面的代码作为注释第13行,我会收到一条警告消息,它说警告:“test.test::x”在这个函数中未初始化使用,但是如果我用第13行编译它,编译器不会警告test::x未初始化 我的问题是: 当我在第13行调用第7行时,为什么编译器没有警告我未初始化的变量x,如果x已经初始化,那是什么时候 #include <iostream> class Test { public: int x; void printX(){ std::cout << x
警告:“test.test::x”在这个函数中未初始化使用
,但是如果我用第13行编译它,编译器不会警告test::x未初始化
我的问题是:
当我在第13行调用第7行时,为什么编译器没有警告我未初始化的变量x,如果x已经初始化,那是什么时候
#include <iostream>
class Test
{
public:
int x;
void printX(){ std::cout << x << std::endl; } // ----------------line 7
};
int main()
{
Test test;
// test.printX(); // --------------------------------------------line 13
std::cout << test.x << std::endl;
return 0;
}
#包括
课堂测试
{
公众:
int x;
void printX(){std::cout你的问题真的很让人困惑。不太清楚你在问什么
无论如何,除非您显式地进行初始化,否则原始数据类型不会初始化。这些类型和POD。只需初始化您的所有数据成员。如果您不进行初始化,它将处于未初始化状态。编译器会尽最大努力帮助您指出错误,但并非总是可能的,您不能依赖这些错误。如果您使用的是最新版本的编译器,您会得到更好的警告
如果x已经初始化,那是什么时候
#include <iostream>
class Test
{
public:
int x;
void printX(){ std::cout << x << std::endl; } // ----------------line 7
};
int main()
{
Test test;
// test.printX(); // --------------------------------------------line 13
std::cout << test.x << std::endl;
return 0;
}
不,x没有初始化。哪个特定的编译器?我正在使用g++编译器查找。更有趣的是,警告取决于优化级别:-O0
(默认)不会发出任何警告,更高级别(即-O1
)确实发出警告。我希望这是另一种情况。甚至不向函数添加const
说明符printX
都有助于禁用优化功能。可能对编译器有更深入了解的人可以提供帮助,我的答案只是猜测。FWIW您应该注意,编译器不需要告诉您idn不初始化x
。对于静态分析工具来说,这更像是一项工作(编译器只做这么多)。@Yksisarvinen在更高的优化级别上,编译器会对代码进行更多的分析,以确定哪些优化是可能的,因此它会注意到未初始化的使用