Переносимость директивы препроцессора #warning

Я знаю, что директива #warning не является стандартной для C / C++, но ее поддерживают несколько компиляторов, включая gcc / g ++. Но для тех, кто его не поддерживает, будут ли они молча игнорировать это или это приведет к сбою компиляции? Другими словами, могу ли я безопасно использовать его в своем проекте, не нарушая сборки компиляторов, которые его не поддерживают?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
54
0
41 836
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Однако # предупреждение - это не #pragma.

Greg Hewgill 05.10.2008 07:51
Ответ принят как подходящий

Скорее всего, если компилятор не поддерживает #warning, он выдаст ошибку. В отличие от #pragma, препроцессору не рекомендуется игнорировать директивы, которые он не понимает.

При этом я использовал компиляторы на разных (достаточно распространенных) платформах, и все они поддерживали #warning.

Видимо, вы никогда не пробовали MS Visual Studio Professional 2015 ;-).

Peter - Reinstate Monica 04.01.2018 20:58

@ PeterA.Schneider: Конечно, в 2008 году не было!

Greg Hewgill 04.01.2018 21:58

Вы, вероятно, получите как минимум предупреждение о нераспознанной директиве от компиляторов, которые не распознают #warning, даже если блок кода не включен в вашу компиляцию. Это могло или не могло быть обработано как ошибка - компилятор мог законно рассматривать это как ошибку, но многие были бы более небрежны.

Знаете ли вы (можете ли вы назвать) компилятор, отличный от GCC / G ++, который предоставляет #warning? [Отредактировано: Компиляторы Sun Solaris 10 (Sparc) и Studio 11 C / C++ принимают #warning.]

Однажды у меня была эта проблема с компилятором для процессора Atmel. И это действительно сгенерировало ошибки препроцессора из-за неизвестного токена #warning.

К сожалению, решение, казалось, заключалось в преобразовании всего исходного дерева для использования эквивалента #pragma и принятии того, что поведение сборки будет отличаться при использовании gcc.

Следует отметить, что MSVC использует синтаксис:

#pragma message ( "your warning text here" )

Обычный синтаксис #warning вызывает фатальную ошибку.

C1021: invalid preprocessor command 'warning'

поэтому он не переносится на эти компиляторы.

Это один из редких случаев, когда MS все делает правильно.

doc 05.08.2010 18:05

Переносим ли синтаксис MSVC? Я имею в виду, будет ли он правильно генерировать предупреждение с другими компиляторами?

aka.nice 11.06.2013 17:34

Просто запустил быструю проверку с помощью gcc-4.7.2. [$ gcc -c -Werror file.c] дает [file.c: 10: 9: note: #pragma message: Foo bar baz] Таким образом, создается «примечание», которое не рассматривается как предупреждение (т.е. t сбой сборки с включенной -Werror). Но он выглядит правильно (как и все #pragmas), поэтому в этом смысле он переносим.

nolandda 15.06.2013 00:16

В MSVC 2008 #pragma message тоже не выдает предупреждения - он просто выводит текст в журнал сборки. В результате f.i. он не отображается в окне Error List и не увеличивает общее количество предупреждений.

nevermind 08.07.2013 21:12

если вы поместите в сообщение слово «предупреждение», оно все равно будет считаться предупреждением, например #pragma message ("предупреждение: foo")

jheriko 06.11.2013 21:07

fwiw, этот синтаксис работает и с openwatcom. (да, я наткнулся на старую ветку. Люди будут вечно гуглить подобные вещи)

JustJeff 27.03.2015 23:02

@JustJeff, не беспокойтесь, ТАК более просвещенное место, чем те старые, покрытые пылью форумы, где им это нравится (навсегда покрытые пылью, как только она осядет). Здесь вы действительно получаете награду (значок?) За продление старого поста.

Sz. 26.11.2015 01:09

@doc Это нет правильный путь, когда он отклоняется от нормы де-факто.

K3---rnc 20.10.2017 23:32

При переключении с mingw на Visual Studio я добавил такие строки в свой глобальный заголовок конфигурации. (включите его в stdafx.h)

#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC#x)

#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))

#endif

//#pragma message "message quoted"
//#pragma message message unquoted

//#warning warning unquoted
//#warning "warning quoted"

PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")

#warning "#pragma warning quoted"

PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")

Теперь я использую PRAGMA_WARNING (это нужно исправить)

К сожалению, в gcc нет #pragma warning, поэтому он предупреждает о неопределенной прагме.

Я сомневаюсь, что gcc добавит #pragma warning", а не microsoft, добавив #warning.

Другие вопросы по теме