这个问题之前就已经问过了,所以我很想再问一次,但是我在google和stackoverflow上搜索都找不到。
我正在把一堆linux的代码移植到windows上,其中有很大一部分是假设所有的东西都自动初始化为0或null。
int whatever;
char* something;
...然后马上做一些可能会让 "某物 "为空的事情,并对 "某物 "进行测试。
if(something == NULL)
{
.......
}
我真的很想不用再回到这段代码中去说。
int whatever = 0;
char* something = NULL;
即使这是处理它的正确方法, 只是非常耗费时间。
否则,我声明一个变量,如果我自己不设置它,它就会被初始化成一些疯狂的东西。
这个选项在MSVC中并不存在,老实说,不管是谁给你的应用程序编码,都犯了一个大错误。那段代码是不可移植的,因为CC++说未初始化的变量有一个未定义的值。我建议设置 "将警告视为错误 "选项并重新编译;MSVC 应 每当一个变量在没有初始化的情况下被使用时,都会给你一个警告。
不,MSVC中没有这样的选项。
调试构建会用其他的东西来初始化它们(我想是0xcc),但不是零。 不幸的是,你的代码有问题,需要修正(当然这只适用于自动变量--对于静态和全局变量,假设它们是零初始化也可以)。我很惊讶有任何编译器支持这种行为--如果GCC中有这样的选项,我没有听说过(但我不是GCC尘封角落的专家)。
你可能会听说MSVC的早期版本会在调试构建中把变量初始化为零(类似于VS 2005中使用0xcc的方式),但据我所知这是不真实的。
编辑----------。
好吧,我真该死--GCC确实(或曾经?-finit-local-zero
选项。 我想,它的存在主要是为了支持Fortran。
我建议使用编译器关于使用未初始化变量的警告来帮助你发现99%的问题。我知道这不是什么了不起的工作,但如果可能的话,应该这样做。
我最后做的是改用w4。 在这个层面上,它抓住了大多数 "是的,这将是一个问题 "的初始化领域。 否则,从初始化时的0xcccccccc到我看到的0x00000000,没有什么可以改变一切。
大量感谢大家的回答,是的,我们会在未来收紧它。