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





На самом деле большинство известных мне компиляторов игнорируют неизвестные директивы #pragma и выводят предупреждающее сообщение, поэтому в худшем случае вы все равно получите предупреждение.
Скорее всего, если компилятор не поддерживает #warning, он выдаст ошибку. В отличие от #pragma, препроцессору не рекомендуется игнорировать директивы, которые он не понимает.
При этом я использовал компиляторы на разных (достаточно распространенных) платформах, и все они поддерживали #warning.
Видимо, вы никогда не пробовали MS Visual Studio Professional 2015 ;-).
@ PeterA.Schneider: Конечно, в 2008 году не было!
Вы, вероятно, получите как минимум предупреждение о нераспознанной директиве от компиляторов, которые не распознают #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 все делает правильно.
Переносим ли синтаксис MSVC? Я имею в виду, будет ли он правильно генерировать предупреждение с другими компиляторами?
Просто запустил быструю проверку с помощью gcc-4.7.2. [$ gcc -c -Werror file.c] дает [file.c: 10: 9: note: #pragma message: Foo bar baz] Таким образом, создается «примечание», которое не рассматривается как предупреждение (т.е. t сбой сборки с включенной -Werror). Но он выглядит правильно (как и все #pragmas), поэтому в этом смысле он переносим.
В MSVC 2008 #pragma message тоже не выдает предупреждения - он просто выводит текст в журнал сборки. В результате f.i. он не отображается в окне Error List и не увеличивает общее количество предупреждений.
если вы поместите в сообщение слово «предупреждение», оно все равно будет считаться предупреждением, например #pragma message ("предупреждение: foo")
fwiw, этот синтаксис работает и с openwatcom. (да, я наткнулся на старую ветку. Люди будут вечно гуглить подобные вещи)
@JustJeff, не беспокойтесь, ТАК более просвещенное место, чем те старые, покрытые пылью форумы, где им это нравится (навсегда покрытые пылью, как только она осядет). Здесь вы действительно получаете награду (значок?) За продление старого поста.
@doc Это нет правильный путь, когда он отклоняется от нормы де-факто.
При переключении с 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.
Однако # предупреждение - это не #pragma.