Подтвердить что ты не робот

Как отключить предупреждения для отдельных файлов include?

Я хотел бы отключить специальные предупреждения для всех файлов, которые включены, прямо или косвенно, с помощью отдельных файлов. Например, я хочу отключить предупреждение "вы назначаете строковый литерал для char *", для всех файлов или файлов, включенных в файлы, включенные в #include <bar/*> (звезда в моем случае означает "что-то может быть здесь" ").

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

Я использую Intel С++ и GCC. Некоторые из моих приятелей используют clang, поэтому я был бы рад услышать решения для этого.

4b9b3361

Ответ 1

При использовании GCC вы можете использовать флаг -isystem вместо флага -I, чтобы отключить предупреждения из этого местоположения.

Итак, если вы в настоящее время используете

gcc -Iparent/path/of/bar …

использование

gcc -isystem parent/path/of/bar …

вместо этого. К сожалению, это не особенно мелкозернистый контроль. Я не знаю более целенаправленного механизма.

Ответ 2

Когда я использую g++, и у меня есть сторонние заголовки, которые генерируют множество предупреждений с моими стандартными значениями по умолчанию -Wall -Wextra и co. Я склонен группировать их в отдельные включения, указав system_header #pragma.

[...] GCC дает код, найденный в системных заголовках специальной обработки. Все предупреждения, кроме тех, которые генерируются #warning (см. Диагностика), подавляются, в то время как GCC обрабатывает системный заголовок. Макросы, определенные в системном заголовке, защищены от нескольких предупреждений, где бы они ни расширялись. Этот иммунитет предоставляется на разовой основе, когда мы обнаруживаем, что предупреждение генерирует множество ложных срабатываний из-за кода в макросах, определенных в заголовках системы.

[...]

Существует также директива #pragma GCC system_header, которая сообщает GCC о том, что остальная часть текущего файла include содержит системный заголовок, независимо от того, где он был найден. Код, который предшествует #pragma в файле, не будет затронут. #pragma GCC system_header не влияет на файл первичного источника.

Я предпочитаю это решение для -isystem, потому что он более мелкозернистый, и я могу использовать его прямо в источниках, не слишком много перепутывая с аргументами командной строки и включающими каталоги.

Пример с отвратительной корневой библиотекой:

#ifndef ROOTHEADERS_HPP_INCLUDED
#define ROOTHEADERS_HPP_INCLUDED
#ifdef __GNUC__
// Avoid tons of warnings with root code
#pragma GCC system_header
#endif
#include "TH1F.h"
#include "TApplication.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TCanvas.h"
#endif

Ответ 3

Лучшее решение GCC: используйте #pragma.

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-W<evil-option>"
#include <evil_file>
#pragma GCC diagnostic pop

например:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QtXmlPatterns>
#pragma GCC diagnostic pop

Ответ 4

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

Просто обновите свой make файл, чтобы использовать этот script вместо прямого вызова компилятора.