Как отключить конкретное неизвестное предупреждение #pragma?(GCC и / или лязг) - PullRequest
23 голосов
/ 02 июля 2011

Я знаю, как отключить все неизвестные предупреждения #pragma. Ответ был дан, например, здесь: SO: Как отключить предупреждения #pragma?

Мой вопрос - есть ли способ отключить предупреждение «неизвестная прагма» для одной конкретной прагмы? Например, если я отключаю предупреждение для #pragma ugubugu следующий код:

#pragma ugubugu
#pragma untiunti   
int main() {return 0;}

при компиляции с:

g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall

должно выдать одно предупреждение:

warning: ignoring #pragma untiunti

Может быть, например, есть простой способ зарегистрировать пользовательскую прагму, которая ничего не делает?

Было бы здорово узнать, есть ли такая опция и в Visual Studio, но это не так важно.

Спасибо!


"но почему в конечном итоге он играет с пользовательскими прагмами?"

Мой источник анализируется двумя компиляторами. В одном из них есть специальный #pragma, который неизвестен другому. Конечно, я мог бы поставить #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif вокруг каждого экземпляра #pragma, но это было бы громоздко.

Ответы [ 3 ]

16 голосов
/ 05 июля 2011

Я вполне уверен, что нет никакого способа сделать это.

И у GCC, и у Clang есть внутренние интерфейсы, которые позволяют интерфейсу языка регистрировать обработчики #pragma с препроцессором - см. GCClibcpp/directives.c и Clang's lib/Lex/Pragma.cpp - но, насколько я вижу, нет ничего, что позволяло бы вам изменять, какие обработчики зарегистрированы (кроме того, что подразумевается для языкового варианта, для которого вы компилируете), на основе параметров командной строки.

Я знаю, как отключить все неизвестные предупреждения #pragma.Ответ был дан, например, здесь: SO: Как отключить предупреждения #pragma?

Обратите внимание, что ответ с наибольшим количеством голосов лучше, чем принятый там ответ.-Wno-unknown-pragmas можно просто добавить в командную строку после всего (например, -Wall), которое включает предупреждение.

Мой источник анализируется двумя компиляторами.В одном из них есть специальный #pragma, который неизвестен другому.Конечно, я мог бы, вероятно, поставить #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif вокруг каждого экземпляра #pragma, но это было бы громоздко.

С более философской точки зрения, я думаю, что это действительно правильное решение, хотя и громоздкоеэто может быть!

Мне кажется правильным скрыть любые #pragma от компилятора, который, как ожидается, не поймет его так, как вы намереваетесь, учитывая, что весь смысл #pragma заключается в предоставлениимеханизм для вызова поведения, определенного реализацией, в компиляторе.

(Если вы в конечном итоге сделаете это, обратите внимание, что Clang определяет __clang__, но и GCC и Clang определяют __GNUC__.)

2 голосов
/ 29 сентября 2017

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

Например, если вы хотите использовать прагму только в Visual C ++, вы можете сделать:

#if defined(_MSC_VER)
#    define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu)
#else
#    define SAFE_PRAGMA_UGUBUGU 
#endif

А потом вы можете написать

SAFE_PRAGMA_UGUBUGU
#pragma untiunti   
int main() {return 0;}
0 голосов
/ 03 июля 2011
  • Компиляторы не допускают пользовательских прагм, потому что прагмы - это (в основном) управляющие директивы компилятора и / или компоновщика.Поскольку это очень близко к конкретной реализации и возможностям компилятора, каково будет применение «определения новых прагм» для пользователя?Фактически, то, что доступные директивы прагмы реализованы на конкретном компиляторе, полностью не зависит от производителя (нет правила стандартизации C ++).
  • Может быть, вы захотите использовать прагмы для разметки специальных разделов вашего кода (например, длянакормить свой собственный препроцессор), так как вы просите директивы no-op.Это можно сделать с помощью препроцессора (#defines).
  • Другая возможность для пользовательской «разметки» в коде C / C ++, например: #MY_PRAGMA, заключается в использовании вашего собственного препроцессора перед кодом C / C ++.

Примером этого типаобработка используется для библиотеки QT, нестандартной системы метаобъектов, которая взаимодействует с компилятором Qt MOC.Это используется для расширения некоторых конструкций, не относящихся к C ++ (например, Q_OBJECT, Q_PROPERTY и т. Д.), Которые позже передаются с правильным синтаксисом в компилятор C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...