C /VisualStudio2017:覆盖C4700编译错误

C++/VisualStudio2017 : Override c4700 compiling error

本文关键字:C4700 编译 错误 覆盖 VisualStudio2017      更新时间:2023-10-16

我正在研究大学的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不是初始化的(dimensiondefauttete,是原始的数据类型,包含不确定的数据)。

)。 )。

然后,您将其传递 by-by-value 到函数 initialiser,在制作副本时,tv读取,以调用未定义的行为。

标准的相关短语在[dcl.init]/12中:

当获得具有自动或动态存储持续时间的对象的存储时间时,对象具有不确定的值,并且如果对象没有执行初始化,则该对象将保留不确定的值,直到替换该值

>

如果通过评估产生不确定的值,则行为是不确定的

要修复它(以及C4700非初始化的可变警告),将tv传递给initialiser by-reference 。。

void initialiser (t_vecteur& tv, int dimension, double defaut) {

传递参考不是从tv读取,因此这样做不再是UB。