问题描述
最近,我阅读了一个编码示例,其中解释了以下内容会导致 Visual Studio 中的编译器错误:
import React,{ Component } from "react";
import { View,Text,SectionList } from "react-native";
import { Picker } from "@react-native-picker/picker";
export default class App extends Component {
find_dimension(layout){
const {x,y,width,height} = layout;
console.warn(x);
console.warn(y);
console.warn(width);
console.warn(height);
}
render(){
return(
<View>
<Picker onLayout={(event) => {this.find_dimension(event.nativeEvent.layout)}}>
<Picker.Item label="Java" value="java" />
<Picker.Item label="JavaScript" value="js" />
</Picker>
</View>
)
}
}
作者声称,由于 int* pointer1;
*pointer1 = 10;
在被取消引用之前未初始化,因此 Visual Studio 中出现以下错误:
C4700:使用了未初始化的局部变量“pointer1”
而且确实如此。这个场景是有道理的。
但是,如果我使用完全相同的代码并使用 g++ 进行编译,则不会发生编译器错误并且我可以以任何正常方式自由使用 pointer1
。
为什么不同? g++ 是否在初始化之前为 pointer1
分配了地址?
解决方法
尝试将 -Wuninitialized -Werror
传递给 gcc。此外,-Wmaybe-uninitialized
可能有助于识别未初始化变量的执行路径。
附带说明:取消引用未初始化的指针是未定义的行为。这意味着编译器可以但不必诊断它。完全归咎于开发者。