Отключить GCC "можно использовать неинициализированным" для определенной переменной - PullRequest
29 голосов
/ 22 февраля 2011

Я получаю это предупреждение о переменной стека:

warning: object.member may be used uninitialized in this function

В этом случае я не хочу заставлять инициализацию просто избавиться от предупреждения, поскольку оно потребляет циклы ЦП. Переменная является структурой POD, поэтому memset для нее не является нулевой стоимостью. Я могу убедиться, что переменная никогда не используется неинициализированной, поэтому я просто хотел бы отключить предупреждение для нее.

В общем, я хочу предупреждение, но не об этой конкретной переменной в данном конкретном сценарии. Как я могу подавить предупреждение?


Похоже, что прагма-диагностика - правильный путь, но для нее требуется довольно свежая версия GCC (4.6)

Не существует приемлемого решения до этой версии.

Ответы [ 4 ]

33 голосов
/ 22 февраля 2011

Попробуйте сделать это:

 #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

Эта прагма имеет три интересных и полезных аромата: warning, error, ignored.См. 6.56.10 Диагностические Прагмы для их использования.Ссылка гласит:

GCC позволяет пользователю выборочно включать или отключать определенные типы диагностики и изменять тип диагностики. Например, политика проекта может потребовать, чтобывсе источники компилируются с -Werror, но некоторые файлы могут иметь исключения, допускающие определенные типы предупреждений.Или проект может выборочно включать диагностику и рассматривать ее как ошибки в зависимости от того, какие макросы препроцессора определены.

5 голосов
/ 22 февраля 2011

@ Наваз ответил на вопрос в том виде, в котором он был задан, но считали ли вы, что тот факт, что вам это нужно, может указывать на то, что вы объявляете struct слишком рано / с меньшим вложенным объемом, чем это необходимо? Как правило, было бы гораздо предпочтительнее, если бы вы могли объявить свой struct в точке, где вы можете фактически инициализировать его, а не объявлять его раньше и заполнять его в различных местах.

Кроме того, даже несмотря на то, что вы можете убедиться, что он никогда не использовался неинициализированным прямо сейчас, что, если кто-то еще добавит новый путь к коду в будущем, и он не будет правильно инициализирован? Если вы отключите предупреждение, оно будет автоматически скомпилировано и, вероятно, неожиданно сработает. Если вы не можете доказать, что инициализация занимает измеримое количество ЦП вашей программы, вероятно, лучше просто выполнить инициализацию заранее.

4 голосов
/ 22 февраля 2011

GCC различает неинициализированный и самоинициализированный, например, компиляции:

int main() {
   int i = i;
   return i;
}

С gcc -Wall -Wextra не выдает никаких предупреждений, если только вы явно не добавили -Winit-self, но это все полностью оптимизировано моим быстрым тестированием.

...