Уважаемые участники форума!
Итак, имеется программный проект на С++, в котором, помимо всего прочего, используется некоторая сторонняя библиотека. Библиотека очень хорошая, однако при компиляции с флагом -Wall компилятор (g++ 4.2.4) выдаёт, мягко говоря, БОЛЬШОЕ количество предупреждений (warnings). Настолько большое, что IDE во время компиляции может просто зависнуть...
Если просто поставить флаг -w, то все предупреждения подавляются. Однако в том-то и проблема, что ВСЕ. А мне обязательно нужно видеть мои предупреждения (то есть имеющиеся в моём коде).
Итак, возможно ли сделать так, чтобы компилятор выдавал ВСЕ предупреждения, обнаруженные в моём коде, при этом НЕ выдавая предупреждений, обнаруженных в заголовочных файлах сторонней библиотеки?
Просмотрел документацию к флагам GCC, но нужного мне не нашёл... В каком направлении копать?
Буду благодарен за ответ.
Предупреждения в заголовочниках сторонней библиотеки (Можно ли отключить только их?..)
Модератор: Модераторы разделов
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Предупреждения в заголовочниках сторонней библиотеки
Может, есть какие-нить #pragma-ы, чтоб отключить ворнинги? Тогда нужную прагму включить перед #include <liba.h> и выключить после.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Предупреждения в заголовочниках сторонней библиотеки
Да, #pragma есть, общего вида:
#pragma GCC diagnostic [kind] [option]
Например, директива:
#pragma GCC diagnostic ignored "-Wall"
проигнорирует опцию -Wall.
Хорошо, я хочу задействовать это решение. Задаю в опциях g++ флаг -Wall.
Теперь пишу:
И кстати, уточнение: действие #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: Предупреждения в заголовочниках сторонней библиотеки
Хм... Попробовал использовать #pragma в GCC - не получилось.
Тривиальнейший пример:
Как видите, допущена ошибка: main() объявлена без указания типа возвращаемого значения.
Если НЕ использовать никаких дополнительных флагов компилятора, то он молча пропускает эту ошибку, не выдавая даже предупреждения.
Если же передать компилятору флаг -pedantic, то он тут же выдаёт ошибку о том, что, мол, нельзя так делать, стандарту противоречит.
Теперь добавляю в код директиву #pragma:
Идея в том, чтобы обмануть компилятор: в командной строке передать флаг -pedantic, а потом в текущей единице трансляции проигнорировать этот флаг.
По идее, теперь компилятор должен опять пропускать эту ошибку, верно? Как бы не так! Он продолжает выдавать ошибку.
Прочитав о порядке расположения директив #pragma в GCC, я из любопытства попробовал написать так:
То же самое.
Я подумал, что, может быть, мой компилятор по умолчанию директивы #pragma игнорирует. Стал искать соответствующий флаг. Однако нашёл только флаг, противоположный по смыслу: он как раз и говорит GCC не обращать внимание на #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: Предупреждения в заголовочниках сторонней библиотеки
deninok писал(а): ↑24.11.2008 11:02Итак, возможно ли сделать так, чтобы компилятор выдавал ВСЕ предупреждения, обнаруженные в моём коде, при этом НЕ выдавая предупреждений, обнаруженных в заголовочных файлах сторонней библиотеки?
Просмотрел документацию к флагам GCC, но нужного мне не нашёл... В каком направлении копать?
Буду благодарен за ответ.
Мне на ум приходит только подавить ненужные предупреждения grep'ом. (Я видел слово IDE, но ничего умнее на ум не идёт)
-
deninok
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Предупреждения в заголовочниках сторонней библиотеки
Ага, решение уже ближе, хотя не намного. Оказывается, директива из приведённого мною выше примера применима только к флагам предупреждений (обычно начинающихся с -W), да и то не ко всем. Хотя флаг -pedantic относится к категории флагов предупреждений, но всё равно решил поэкспериментировать.
Скомпилировал тот же код с флагом -Wall, убрав флаг -pedantic. Теперь компилятор выдал уже не ошибку, а предупреждение.
Меняю директиву #pragma:
#pragma GCC diagnostic ignored "-Wall"
Компилирую - бесполезно: предупреждение осталось, хотя должно было исчезнуть...
Нет, это не годится...
Скомпилировал тот же код с флагом -Wall, убрав флаг -pedantic. Теперь компилятор выдал уже не ошибку, а предупреждение.
Меняю директиву #pragma:
#pragma GCC diagnostic ignored "-Wall"
Компилирую - бесполезно: предупреждение осталось, хотя должно было исчезнуть...
(Skladnoy) писал(а):Мне на ум приходит только подавить ненужные предупреждения grep'ом. (Я видел слово IDE, но ничего умнее на ум не идёт)
Нет, это не годится...