Як придушити попередження GCC від заголовків бібліотеки?


126

У мене є проект, який використовує бібліотеки log4cxx, boost та ін., Заголовки яких генерують безліч (повторюваних) попереджень. Чи є спосіб придушити попередження з бібліотеки, що включає (тобто #include <some-header.h>) або включає з певних шляхів? Я хотів би використовувати -Wall та / або -Wextra, як зазвичай, у коді проекту, не затушовуючи відповідну інформацію. В даний час я використовую grep для виведення, але я хотів би щось краще.

Відповіді:


127

Ви можете спробувати включити заголовки бібліотеки, використовуючи -isystemзамість них -I. Це зробить їх «системними заголовками», і GCC не повідомлятиме про них попереджень.


11
Якщо ви намагаєтеся зробити це в XCode, тоді дотримуйтесь -isystem шлях у ваші "інші C ++ прапори" у "спеціальні прапорці компілятора" у ваших цільових налаштуваннях збірки.
Метт Паркінс

3
Один з потенційних недоліків полягає в тому, що на деяких платформах g ++ автоматично загортає будь-які заголовки системи extern "C", що призводить до незвичайних помилок щодо зв’язку C, якщо ви #includeвказуєте заголовок C ++ -isystem.
Тавіан Барнс

1
+1 допоміг мені вирішити проблеми з набридливим BOOST попередження stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom

3
Чому за це є стільки більше голосів, ніж відповідь власної ОП, яка сказала саме те саме на 1,5 години раніше?
підкреслюй_d

1
Для Xcode: Що робити, якщо в налаштуваннях цільової збірки не було шляху папки в "Інші прапорці C ++"? Чи може хтось детальніше розглянути ці рішення?
Осір

107

Для тих, хто використовує CMake, ви можете змінити свої include_directoriesдирективи, щоб вони включали символ, SYSTEMякий пригнічує попередження щодо таких заголовків.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

Що робити, якщо бібліотека надає ${LIBFOO_USE_FILE}змінну, яку слід використовувати з командою включення () CMake ?
waldyrious

2
Це, здається, майже рішення моєї проблеми. У мене є 1.) двійкова ціль, яка залежить від 2.) лише цільовий заголовок, написаний власноруч, який залежить від 3.) деяких зовнішніх бібліотек. Я поняття не маю, як отримати попередження лише для 1 і 2. У вас є ідеї?
knedlsepp

2
Здається, це не працює. Я спробував це з проектом, який використовує, easylogging++і я отримую стільки ж величезних попереджень, easylogging++.hнавіть якщо папка, в якій він знаходиться, була включена з SYSTEMопцією.
rbaleksandar

Дякую ТАКІ МНОГО за це. Це врятувало мене від сторінок і сторінок попереджень.
Свалорцен

1
Той самий коментар, що і до прийнятої відповіді: для мене це погана практика.
Раффі

55

Можна використовувати прагми. Наприклад:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop

3
Доступний лише для GCC> = 4.6
Caduchon

1
Мені подобається вміння прагмати поп / поп. я пам’ятаю щось на зразок java, доступного років тому, і розчарування / ревнощі до C / C ++. мені подобається, що це доступно уgcc
Тревор Бойд Сміт

@TrevorBoydSmith MS також clмає здатність роками ... Часом gccтрохи повільно адаптується.
Алексіс Вілке

29

Я знайшов хитрість. Для бібліотеки входить замість -Idirвикористання -isystem dirу makefile. Потім GCC розглядає прискорення і т.д., оскільки система включає і ігнорує будь-які попередження від них.


Зауважте, що якщо ви використовуєте заздалегідь складений заголовок, вам потрібно додати прапор під час компіляції і заголовка, і коду.
користувач202729

9

#pragmaє інструкціями до компілятора. ви можете встановити щось перед #include і відключити його після.

Ви також можете це зробити в командному рядку .

Ще одна сторінка GCC, спеціально щодо відключення попереджень .

Я б хотів скористатися можливістю використання # pragma's у вихідному коді, а потім надати надійну причину (як коментар) того, чому ви вимикаєте попередження. Це означатиме міркування файлів заголовків.

GCC підходить до цього шляхом класифікації типів попередження. Ви можете класифікувати їх як попередження або ігнорування. Раніше пов'язані статті покажуть вам, які попередження можуть бути відключені.

Примітка: ви також можете масажувати вихідний код, щоб запобігти певним попередженням, використовуючи атрибути ; однак це пов'язує вас досить тісно з GCC.

Примітка2: GCC також використовує інтерфейс pop / push, який використовується у компіляторі microsoft - Microsoft відключає попередження через цей інтерфейс. Я пропоную вам дослідити це далі, оскільки я не знаю, чи це можливо.


Я розглядав прагми, але якщо я припиняю попередження перед включенням заголовка, то як повернути його до попереднього стану після #include? Я хочу побачити всі попередження щодо коду проекту (допоміг мені вже кілька разів), але маю контроль з командного рядка.
AdSR

4

Ви можете спробувати використати попередньо складені заголовки . Попередження не зникнуть, але принаймні не відображатимуться у вашій основній компіляції.


1
Це насправді може бути хорошою ідеєю. Сторонні включення не змінюються щодня.
AdSR

Саме так. Хоча я не використовував їх так багато в Linux, вони досить добре працюють у Visual Studio.
Пабло Санта-Крус

Ні, вони все одно відображатимуться в компіляції, якщо ви не скористаєтесь іншим способом їх придушення (наприклад -isystem, але пам’ятайте, що використовувати його як при складанні заголовка, так і в коді)
user202729


1

Поклавши наступне

#pragma GCC system_header

вимкне попередження GCC для всіх наступних кодів у цьому файлі.


-9

Для цих попереджень повинні бути причини. Вони можуть бути викликані помилками у вашому коді, який використовує бібліотека, або помилками самого коду бібліотеки. У першому випадку виправте свій код. У другому випадку або припиніть користуватися бібліотекою, або якщо це код FOSS, виправте це.


+1 за гарну пораду: D, але він запитує, як зробити щось конкретне: D
Хасан

4
Деякі застереження неможливо виправити чи дуже важко, особливо у сторонньому коді, особливо в такому коді, багатому метапрограмуванням, як Boost.
ulidtko

3
Гірше того, що мене клопоче , - це "оголошення" c "тіней члена" цього "[-Werror = тінь]" глибокого, глибокого в деякому заголовку підвищення. Це, звичайно, не є проблемою, але це та подібні проблеми викликають вивільнення, і мені важко знайти випадки справжнього затінення в нашій кодовій базі.
dmckee --- кошеня колишнього модератора
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.