Поделиться через


Предупреждение компилятора (уровень 1 и уровень 4) C4700

неинициализированная локальная переменная "name" используется

Замечания

Имя локальной переменной было использовано, т. е. считывается, прежде чем оно было назначено значение. В C и C++локальные переменные по умолчанию не инициализированы. Неинициализированные переменные могут содержать любое значение, а их использование приводит к неопределенному поведению. Предупреждение C4700 почти всегда указывает на ошибку, которая может вызвать непредсказуемые результаты или сбои в программе.

Чтобы устранить эту проблему, можно инициализировать локальные переменные при объявлении или назначить им значение перед их использованием. Функцию можно использовать для инициализации переменной, передаваемой в качестве эталонного параметра, или при передаче его адреса в качестве параметра указателя.

Параметр /sdl компилятора (включение дополнительных проверок безопасности) повышает этот предупреждение до ошибки.

Пример

Этот пример создает C4700 при использовании переменных tuи v используется перед инициализацией и показывает тип значения мусора, которое может привести. Переменные x, yи z не вызывают предупреждение, так как они инициализированы перед использованием:

// c4700.cpp
// compile by using: cl /EHsc /W4 c4700.cpp
#include <iostream>

// function takes an int reference to initialize
void initialize(int& i)
{
    i = 21;
}

int main()
{
    int s, t, u, v;   // Danger, uninitialized variables

    s = t + u + v;    // C4700: t, u, v used before initialization
    std::cout << "Value in s: " << s << std::endl;

    int w, x;         // Danger, uninitialized variables
    initialize(x);    // fix: call function to init x before use
    int y{10};        // fix: initialize y, z when declared
    int z{11};        // This C++11 syntax is recommended over int z = 11;

    w = x + y + z;    // Okay, all values initialized before use
    std::cout << "Value in w: " << w << std::endl;
}

При выполнении tэтого кода и uv неинициализации выходных данных для s непредсказуемого:

Value in s: 37816963
Value in w: 42