Недавно мы включили -Wall
для проекта. Он включен, когда GCC находится на уровне 4.7 или выше (или Clang), потому что мы можем использовать GCC diagnostic
для управления выходом с повышенными предупреждениями. Мы хотим управлять ими из исходного кода, а не через аргументы командной строки. (Мы не хотим загрязнять командную строку или попросить пользователей библиотеки заново открыть то, что необходимо).GCC не оценивает «pragma GCC diagnost» для предупреждения об отключении
Под GCC 4.8 и 5.1, мы догоняем предупреждения, которые были отключены в диагностическом блоке НКУ для -Wunused-variable
, -Wunused-value
, -Wunused-function
и -Wunknown-pragmas
. Оба ГЦСА принимает -fopenmp
, и оба определяют _OPENMP
в ответ на это, так что я довольно уверен, что мы никогда не должны видеть -Wunknown-pragmas
в ответ на #prgam omp ...
(это является отключена, но не неизвестна).
g++ -DNDEBUG -g2 -O3 -Wall -march=native -pipe -c nbtheory.cpp
nbtheory.cpp:655:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]
#pragma omp parallel
^
nbtheory.cpp:656:0: warning: ignoring #pragma omp sections [-Wunknown-pragmas]
#pragma omp sections
^
...
В данном конкретном случае file nbtheroy.cpp
имеет следующий охранник в месте, чтобы помочь управлять этим предупреждением (только соответствующие части показаны, но вы можете увидеть все от the GitHub link):
// Defines GCC_DIAGNOSTIC_AWARE if GCC 4.7 or above.
#include <misc.h>
...
#if GCC_DIAGNOSTIC_AWARE
# pragma GCC diagnostic ignored "-Wunknown-pragmas"
#endif
...
Integer ModularRoot(const Integer &a, const Integer &dp, const Integer &dq,
const Integer &p, const Integer &q, const Integer &u)
{
Integer p2, q2;
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
p2 = ModularExponentiation((a % p), dp, p);
#pragma omp section
q2 = ModularExponentiation((a % q), dq, q);
}
return CRT(p2, p, q2, q, u);
}
...
Поскольку файл *.cpp
(его эффективно блок перевода), мы не выполнить #pragma GCC diagnostic push
в начале и #pragma GCC diagnostic pop
в конце. (Мы делаем это для файлов заголовков, которые включены, однако). (Мы также пытались это сделать, но это не помогло).
А вот GCC_DIAGNOSTIC_AWARE
(от misc.h
):
// Used to suppress some warnings in some header and implementation files.
// Some platforms, like CentOS and OpenBSD, use old compilers that don't understand -Wno-unknown-pragma.
#define GCC_DIAGNOSTIC_AWARE ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__))
Я знаю, что охранник работает, потому что добавление в блоке с #error
вызывает ошибку. Кроме того, комментирование охранника и вызывание #pragma GCC diagnostic ignored "-Wunknown-pragmas"
не помогает. Наконец, он отлично работает под Кланом.
Я также испытываю это для других предупреждений, таких как -Wunused-variable
, -Wunused-value
и -Wunused-function
. I действительно не хотят загрязнять командную строку, как предполагалось, с помощью потенциального дубликата.
Как я могу получить механизм GCC pragma diagnostic
для работы, как ожидается, для предупреждения об отключении под GCC при использовании -Wall
?
Связанные, если вы хотите, чтобы воспроизвести его (ее GNUmakefile основе, и не требует конфигурации или Autotools):
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
make
EDIT: мы проверили в патч, который отключает -Wall
кроме для Клана. Если вы хотите воспроизвести старое поведение, то:
git clone https://github.com/weidai11/cryptopp.git cryptopp-warn
cd cryptopp-warn
export CXXFLAGS="-g2 -O3 -DNDEBUG -Wall"
make
Я бы предложил сначала удалить '# if/# endif' (оставив только' #pragma GCC ... '), чтобы увидеть, есть ли проблема с' GCC_DIAGNOSTIC_AWARE'. – paxdiablo
Возможный дубликат [Suppress -Wunknown-pragmas warning in GCC] (http://stackoverflow.com/questions/12842306/suppress-wunknown-pragmas-warning-in-gcc) – nneonneo
@paxdiablo - Нет радости. Я отключил охрану и выкрикнул «#pragma GCC diagnostic ignored» -Wunknown-pragmas »' непосредственно. – jww