Подтвердить что ты не робот

Как отключить неизвестное предупреждение #pragma? (GCC и/или clang)

Я знаю, как отключить все неизвестные предупреждения #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, но это было бы громоздким.

4b9b3361

Ответ 1

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

Оба GCC и Clang имеют внутренние интерфейсы, которые позволяют интерфейсу языка регистрировать обработчики #pragma с препроцессором - см. GCC libcpp/directives.c и Clang 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

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

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

#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;}

Ответ 3

  • Составители не разрешают настраиваемые прагмы, потому что прагмы являются (главным образом) директивами для компилятора и/или компоновщика. Поскольку это очень близко к конкретной реализации и функциям компилятора, каким будет применение "определения новых прагм" для пользователя? Фактически, какие доступные директивы pragma реализованы на конкретном компиляторе, полностью независимы от поставщика (нет стандартного правила С++).
  • Возможно, вы хотите использовать прагмы для разметки специальных разделов вашего кода (например, для подачи собственного препроцессора), так как вы запрашиваете директивы no-op. Это можно сделать с помощью препроцессора (#defines).
  • Еще одна возможность для пользовательской "разметки" в коде C/С++, например: #MY_PRAGMA - использовать ваш собственный препроцессор перед C/С++.

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