Скажите GCC, чтобы предположить, что объект инициализирован

При компиляции в 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() конечно, не следует вызывать случайный мусор, и размещение там прагмы может привести к тому, что другие ошибки останутся незамеченными.

Какие-либо решения?

-2

Решение

Самое простое решение — (избыточно) инициализировать эту переменную, например, добавляя:

int foo=0;

оптимизирующий компилятор (например, g++ -O2) очень вероятно, чтобы удалить эту инициализацию, если она не нужна. Кстати, если компилятор не оптимизирует это в вашем конкретном случае, издержки такой инициализации действительно невелики.

Если foo это пример некоторых class Вы могли бы определить конструктор без операции (возможно, private: один) и сделай свою функцию friend этого класса.
Если foo какой-то указатель инициализирует его nullptr,

Кстати, такая явная инициализация делает ваш код более удобочитаемый и менее хрупким и, возможно, даже более Кэш процессора дружелюбный. Вы можете добавить комментарий, объясняющий, почему и как это может быть ненужным. ИМХО увеличение читабельности достаточно, чтобы оправдать такую ​​инициализацию.

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

В качестве альтернативы (но я не рекомендую) использовать функция конкретной прагмы (как уже упоминалось в вашем вопросе), чтобы отключить такое предупреждение.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]