Предупреждения в заголовочниках сторонней библиотеки (Можно ли отключить только их?..)

Модератор: Модераторы разделов

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Предупреждения в заголовочниках сторонней библиотеки

Сообщение deninok »

Уважаемые участники форума!

Итак, имеется программный проект на С++, в котором, помимо всего прочего, используется некоторая сторонняя библиотека. Библиотека очень хорошая, однако при компиляции с флагом -Wall компилятор (g++ 4.2.4) выдаёт, мягко говоря, БОЛЬШОЕ количество предупреждений (warnings). Настолько большое, что IDE во время компиляции может просто зависнуть...

Если просто поставить флаг -w, то все предупреждения подавляются. Однако в том-то и проблема, что ВСЕ. А мне обязательно нужно видеть мои предупреждения (то есть имеющиеся в моём коде).

Итак, возможно ли сделать так, чтобы компилятор выдавал ВСЕ предупреждения, обнаруженные в моём коде, при этом НЕ выдавая предупреждений, обнаруженных в заголовочных файлах сторонней библиотеки?

Просмотрел документацию к флагам GCC, но нужного мне не нашёл... В каком направлении копать?

Буду благодарен за ответ.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Предупреждения в заголовочниках сторонней библиотеки

Сообщение Portnov »

Может, есть какие-нить #pragma-ы, чтоб отключить ворнинги? Тогда нужную прагму включить перед #include <liba.h> и выключить после.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Предупреждения в заголовочниках сторонней библиотеки

Сообщение deninok »

Да, #pragma есть, общего вида:
#pragma GCC diagnostic [kind] [option]

Например, директива:
#pragma GCC diagnostic ignored "-Wall"
проигнорирует опцию -Wall.

(Portnov) писал(а):Тогда нужную прагму включить перед #include <liba.h> и выключить после.

Хорошо, я хочу задействовать это решение. Задаю в опциях g++ флаг -Wall.
Теперь пишу:

Код: Выделить всё

// some_my_header.h

#pragma GCC diagnostic ignored "-Wall"    // Вот я включаю #pragma...

#include <lib_1.h>
...
#include <lib_n.h>

// И как теперь выключить эту #pragma?

// Тут уже начинается мой код, к которому -Wall должна применяться...

И кстати, уточнение: действие #pragma-директивы распространяется до конца текущей единицы трансляции, или как?
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Предупреждения в заголовочниках сторонней библиотеки

Сообщение deninok »

Хм... Попробовал использовать #pragma в GCC - не получилось.
Тривиальнейший пример:

Код: Выделить всё

#include <iostream>
main() {
    std::cout << "end" << std::endl;
    return 0;
}

Как видите, допущена ошибка: main() объявлена без указания типа возвращаемого значения.
Если НЕ использовать никаких дополнительных флагов компилятора, то он молча пропускает эту ошибку, не выдавая даже предупреждения.
Если же передать компилятору флаг -pedantic, то он тут же выдаёт ошибку о том, что, мол, нельзя так делать, стандарту противоречит.

Теперь добавляю в код директиву #pragma:

Код: Выделить всё

#include <iostream>
#pragma GCC diagnostic ignored "-pedantic"
main() {
    std::cout << "end" << std::endl;
    return 0;
}

Идея в том, чтобы обмануть компилятор: в командной строке передать флаг -pedantic, а потом в текущей единице трансляции проигнорировать этот флаг.
По идее, теперь компилятор должен опять пропускать эту ошибку, верно? Как бы не так! Он продолжает выдавать ошибку.

Прочитав о порядке расположения директив #pragma в GCC, я из любопытства попробовал написать так:

Код: Выделить всё

#pragma GCC diagnostic ignored "-pedantic"
#include <iostream>
main() {
    std::cout << "end" << std::endl;
    return 0;
}

То же самое.

Я подумал, что, может быть, мой компилятор по умолчанию директивы #pragma игнорирует. Стал искать соответствующий флаг. Однако нашёл только флаг, противоположный по смыслу: он как раз и говорит GCC не обращать внимание на #pragma. Но я не использую этот флаг, следовательно, в моей конфигурации GCC должен обрабатывать эти директивы...

Ну и что делать? Данная директива у кого-нибудь работает? Если я что-то делаю не так, то покажите, пожалуйста...
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: Предупреждения в заголовочниках сторонней библиотеки

Сообщение Skladnoy »

deninok писал(а):
24.11.2008 11:02
Итак, возможно ли сделать так, чтобы компилятор выдавал ВСЕ предупреждения, обнаруженные в моём коде, при этом НЕ выдавая предупреждений, обнаруженных в заголовочных файлах сторонней библиотеки?

Просмотрел документацию к флагам GCC, но нужного мне не нашёл... В каком направлении копать?

Буду благодарен за ответ.

Мне на ум приходит только подавить ненужные предупреждения grep'ом. (Я видел слово IDE, но ничего умнее на ум не идёт)
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Предупреждения в заголовочниках сторонней библиотеки

Сообщение deninok »

Ага, решение уже ближе, хотя не намного. Оказывается, директива из приведённого мною выше примера применима только к флагам предупреждений (обычно начинающихся с -W), да и то не ко всем. Хотя флаг -pedantic относится к категории флагов предупреждений, но всё равно решил поэкспериментировать.

Скомпилировал тот же код с флагом -Wall, убрав флаг -pedantic. Теперь компилятор выдал уже не ошибку, а предупреждение.

Меняю директиву #pragma:
#pragma GCC diagnostic ignored "-Wall"

Компилирую - бесполезно: предупреждение осталось, хотя должно было исчезнуть...

(Skladnoy) писал(а):Мне на ум приходит только подавить ненужные предупреждения grep'ом. (Я видел слово IDE, но ничего умнее на ум не идёт)

Нет, это не годится...
Спасибо сказали: