C /VisualStudio2017:覆盖C4700编译错误
C++/VisualStudio2017 : Override c4700 compiling error
我正在研究大学的C 项目,并且在以下代码中遇到了一个非初始化指针的问题:
#include <iostream>
using namespace std;
struct t_coord {
double valeur;
int indice;
t_coord *suiv;
};
struct t_vecteur {
int dimension;
double defaut;
t_coord *tete;
};
void initialiser (t_vecteur tv, int dimension, double defaut) {
tv.dimension = dimension;
tv.defaut = defaut;
tv.tete = nullptr;
}
int main () {
t_vecteur tv;
initialiser(tv, 5, 3.14);
return 0;
}
无论如何是否有覆盖VisualStudio中的C4700错误,以便我可以使用我的初始化函数" initialiser()"?最终汇编将在GNU上完成,该汇编不考虑非专业化变量,并且在项目中指定我必须创建一个函数来初始化我的t_vecteur。
预先感谢
struct t_vecteur
是一个聚合,因此,实例tv
不是初始化的(dimension
,defaut
和tete
,是原始的数据类型,包含不确定的数据)。
然后,您将其传递 by-by-value 到函数 initialiser
,在制作副本时,从 tv
读取,以调用未定义的行为。
标准的相关短语在[dcl.init]/12中:
当获得具有自动或动态存储持续时间的对象的存储时间时,对象具有不确定的值,并且如果对象没有执行初始化,则该对象将保留不确定的值,直到替换该值
>如果通过评估产生不确定的值,则行为是不确定的
要修复它(以及C4700非初始化的可变警告),将tv
传递给initialiser
by-reference 。。
void initialiser (t_vecteur& tv, int dimension, double defaut) {
传递参考不是从tv
读取,因此这样做不再是UB。