При компиляции в GCC с -Wall
, GCC предупредит об использовании переменных, которые могут быть неинициализированы. Однако, как программист, я знаю, что переменная должна быть инициализирована, если элемент управления входит в определенный if
заявление:
int foo;
/* conditional assignment of foo goes here */
if (/* complicated condition that guarantees that foo has been initialized */){
return test(foo);
}
В приведенном выше коде, GCC будет жаловаться, что foo
может быть использован неинициализирован. В частности, жалоба будет возникать изнутри определения test()
, где foo
на самом деле используется.
Есть встроенный GCC или эквивалентный, чтобы сказать компилятору, что foo
уже инициализирован? Например:
if (/* complicated condition that guarantees that foo has been initialized */){
__assume_initialized(foo);
return test(foo);
}
Обратите внимание, что размещение #pragma GCC diagnostic ignored "-Wuninitialized"
до линии return test(foo)
недостаточно, поскольку неинициализированное предупреждение возникает в результате использования (например, сравнения) foo в определении test()
возможно в другом модуле компиляции, где прагма не будет существовать.
Я также не хочу помещать прагму в определение test()
потому что проблема не с test()
, test()
конечно, не следует вызывать случайный мусор, и размещение там прагмы может привести к тому, что другие ошибки останутся незамеченными.
Какие-либо решения?
Самое простое решение — (избыточно) инициализировать эту переменную, например, добавляя:
int foo=0;
оптимизирующий компилятор (например, g++ -O2
) очень вероятно, чтобы удалить эту инициализацию, если она не нужна. Кстати, если компилятор не оптимизирует это в вашем конкретном случае, издержки такой инициализации действительно невелики.
Если foo
это пример некоторых class
Вы могли бы определить конструктор без операции (возможно, private:
один) и сделай свою функцию friend
этого класса.
Если foo
какой-то указатель инициализирует его nullptr
,
Кстати, такая явная инициализация делает ваш код более удобочитаемый и менее хрупким и, возможно, даже более Кэш процессора дружелюбный. Вы можете добавить комментарий, объясняющий, почему и как это может быть ненужным. ИМХО увеличение читабельности достаточно, чтобы оправдать такую инициализацию.
Я склонен всегда инициализировать локальные объекты, оставляя компилятору возможность оптимизировать большинство бесполезных инициализаций.
В качестве альтернативы (но я не рекомендую) использовать функция конкретной прагмы (как уже упоминалось в вашем вопросе), чтобы отключить такое предупреждение.
Других решений пока нет …