Что случилось с:
#warning "Come back and implement this"
#warning "Do not do that!"
#warning "Must fix this before release"
Обычно компилятор включает аргумент(ы) до - или материал после - #warning
в сообщении об ошибке или предупреждении.
И, как правило, если компилятор обнаруживает что-то, требующее предупреждения, он довольно четко сообщает об этом.
Учитывая требования, я думаю, что единственный способ справиться с этим - защитить директивы #warning
...
#ifdef DO_WARNINGS
#warning "Some warning"
#endif /* DO_WARNINGS */
В большинстве случаев вы компилируете без -DDO_WARNINGS
; когда вам нужно проверить предупреждения #warning
(с -Werror
), вы в конце концов включаете -DDO_WARNINGS
, соглашаясь с тем, что компиляция завершится ошибкой. Помните, что make -k
сделает все возможное даже при наличии отдельных ошибок компиляции.
В разделе 5.52.9 руководства GCC 4.4.1 говорится (частично):
5.52.9 Диагностические прагмы
GCC позволяет пользователю выборочно включать или отключать определенные типы диагностики и изменять тип диагностики. Например, политика проекта может требовать, чтобы все исходные коды компилировались с параметром «-Werror», но некоторые файлы могут иметь исключения, допускающие определенные типы предупреждений. Или проект может выборочно включать диагностику и рассматривать их как ошибки в зависимости от того, какие макросы препроцессора определены.
#pragma GCC diagnostic kind option
Изменяет расположение диагностики. Обратите внимание, что не все диагностические данные можно изменить; на данный момент можно управлять только предупреждениями (обычно управляемыми ‘-W...’), а не всеми. Используйте «-fdiagnostics-show-option», чтобы определить, какие диагностики являются управляемыми и какой параметр ими управляет. типом является «ошибка», чтобы рассматривать эту диагностику как ошибку, «предупреждение», чтобы рассматривать ее как предупреждение (даже если действует «-Werror»), или «игнорировать», если диагностику следует игнорировать. option — это строка в двойных кавычках, которая соответствует параметру командной строки.
#pragma GCC diagnostic warning "-Wformat"
#pragma GCC diagnostic error "-Wformat"
#pragma GCC diagnostic ignored "-Wformat"
Обратите внимание, что эти прагмы переопределяют любые параметры командной строки. Кроме того, хотя синтаксически допустимо размещать эти прагмы в любом месте ваших источников, единственное поддерживаемое место для них — до того, как будут определены какие-либо данные или функции. В противном случае это может привести к непредсказуемым результатам в зависимости от того, как оптимизатор управляет вашими источниками. Если одна и та же опция указана несколько раз, действует последняя указанная опция. Эта прагма предназначена не для замены параметров командной строки общего назначения, а для реализации строгого контроля над политиками проекта.
GCC также предлагает простой механизм для вывода сообщений во время компиляции.
#pragma message string
Выводит строку как сообщение компилятора при компиляции. Сообщение носит только информационный характер и не является ни предупреждением компиляции, ни ошибкой.
#pragma message "Compiling " __FILE__ "..."
строка может быть заключена в круглые скобки и печатается с информацией о местоположении.
Я не уверен, хотите ли вы преобразовать свои #warning
строк в #pragma message
строк. Это избавит вас от проблемы - и это только хуже, чем добавление условной компиляции вокруг #warning
, поскольку #pragma message
может поддерживаться меньшим количеством компиляторов. Это зависит от ваших требований к переносимости.
person
Jonathan Leffler
schedule
07.12.2010
-fdiagnostics-show-option
для gcc сообщает вам, какая опция управляет каждым возникающим предупреждением. Может у xt-xcc есть такое? - person Cascabel   schedule 07.12.2010-Wno-error=cpp
работает с моейgcc
версией 4.6.1 (см. мой ответ). Более новый gcc изящно называет название категории для предупреждения... :-) - person FooF   schedule 24.09.2012