Возможно иметь код, который работает везде и испускает пользовательские
предупреждения о многих компиляторах, включая большинство компиляторов,
использовать (GCC, clang, MSVC, Intel, ...).
Во-первых, мы должны различать предупреждения и информационные
Сообщения. Я думаю, что единственное, что имеет смысл, это то, что если вы
составить с фатальными предупреждениями ( например, , -Werror
в GCC), предупреждениями
должен привести к сбою компиляции, тогда как информационные сообщения
не должны.
Как упоминается в оригинальном вопросе, MSVC 9.0+ поддерживает
#pragma message("Hello")
Несмотря на (ИМХО неудачное) имя, MSVC выдаст предупреждение здесь,
не информационное сообщение. AFAICT нет никакого способа испустить
информационное сообщение.
GCC 4.8+ и Intel поддерживают прагмы с предупреждающими сообщениями, что означает, что мы можем
используйте препроцессор для их генерации:
#pragma GCC warning "Hello"
Обратите внимание, что начиная с версии 18 PGI не поддерживает такие предупреждения, даже
хотя pgc ++ маскируется под версию GCC, которая должна (т.е.
__GNUC__
, __GNUC_MINOR__
и __GNUC_PATCHLEVEL__
устанавливает значения, которые
указать GCC> = 4.8). Они есть
1020 * известно *
вопроса. Чтобы обойти это, все еще позволяя некоторое будущее
версию PGI, которая поддерживает те, чтобы работать должным образом, вы можете сделать
что-то вроде:
#if defined(__PGI)
# pragma diag_suppress 1675
#endif
К сожалению, я не думаю, что есть способ нажать / выдвинуть предупреждение
стек для PGI, поэтому, если вы сделаете это, все последующие неизвестные прагмы будут
быть тихо проигнорированным. Также имейте в виду, что #pragma message
PGI молча игнорирует (он даже не выдаст предупреждение о
прагма неизвестна).
Clang также поддерживает #pragma GCC warning
(а также #pragma clang
...
), но с 6.0 такие предупреждения на самом деле являются информационными (я
подал ошибку). Я не уверен, когда была добавлена поддержка, но версия Clang
числа в любом случае довольно бесполезны (благодаря Apple, установив их
что-то совершенно другое в их лязге
распределение). К сожалению, нет __has_pragma
функционального теста
макрос, но мы можем временно отключить неизвестные предупреждения прагмы так
что если компилятор не поддерживает прагму, он будет молча
игнорируется вместо выдачи нежелательного предупреждения:
#if defined(__has_warning)
# if __has_warning("-Wunknown-pragmas")
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunknown-pragmas"
# pragma message "Hello"
# pragma clang warning "Hello"
# pragma clang diagnostic pop
# endif
#endif
Конечно, это уродливо, но, по крайней мере, мы можем спрятать его за макросом.
Cray 5.0+ также имеет прагму для сообщений:
#pragma _CRI message "Hello"
У меня нет доступа к компилятору Cray, поэтому я не уверен
о том, является ли это информационным или предупреждением. Если кто-то знает
пожалуйста, прокомментируйте!
Собрав все вместе, я недавно добавил несколько макросов в
Хедли чтобы справиться с этим, текущий
версия выглядит так:
#if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
# define HEDLEY_MESSAGE(msg) \
HEDLEY_DIAGNOSTIC_PUSH \
_Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
HEDLEY_PRAGMA(message msg) \
HEDLEY_DIAGNOSTIC_POP
#elif \
HEDLEY_GNUC_VERSION_CHECK(4,4,0) || \
HEDLEY_INTEL_VERSION_CHECK(16,0,0)
# define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message msg)
#elif HEDLEY_CRAY_VERSION_CHECK(5,0,0)
# DEFINE HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(_CRI message msg)
#else
# define HEDLEY_MESSAGE(msg)
#endif
#if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
# define HEDLEY_WARNING(msg) \
HEDLEY_DIAGNOSTIC_PUSH \
_Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
HEDLEY_PRAGMA(clang warning msg) \
HEDLEY_DIAGNOSTIC_POP
#elif \
(HEDLEY_GNUC_VERSION_CHECK(4,8,0) && !defined(__PGI)) || \
HEDLEY_INTEL_VERSION_CHECK(16,0,0)
# define HEDLEY_WARNING(msg) HEDLEY_PRAGMA(GCC warning msg)
#elif HEDLEY_MSVC_VERSION_CHECK(15,0,0)
# define HEDLEY_WARNING(msg) HEDLEY_PRAGMA(message(msg))
#else
# define HEDLEY_WARNING(msg) HEDLEY_MESSAGE(msg)
#endif
Если вы не хотите использовать Hedley (это единственный публичный домен / заголовок CC0 только для такого рода вещей), вы можете заменить внутренние макросы без особых усилий. Если вы сделаете это, я бы посоветовал основывать ваш порт на репо Хедли, а не на этот ответ, так как я с большей вероятностью буду обновлять его.