Как мне сгенерировать ошибку или предупреждение в препроцессоре C?
У меня есть программа, которая должна быть скомпилирована только в режиме отладки. (цель тестирования)
Как сделать так, чтобы препроцессор предотвращал компиляцию в режиме RELEASE?
7 ответов
Место где угодно:
#ifndef DEBUG
#error Only Debug builds are supported
#endif
С предоставить #error
заявление, и большинство компиляторов добавляют #warning
заявление. Документация gcc рекомендует процитировать сообщение.
Может быть, что-то более изощренное, но это всего лишь копирование и вставка предыдущих решений.:-)
#ifdef DEBUG
#pragma message ( "Debug configuration - OK" )
#elif RELEASE
#error "Release configuration - WRONG"
#else
#error "Unknown configuration - DEFINITELY WRONG"
#endif
PS Есть еще один способ, как сгенерировать предупреждение. Создайте ссылку без ссылки, например
HereIsMyWarning:
и не ссылаться на это. Во время компиляции вы получите предупреждение типа
1>..\Example.c(71) : warning C4102: 'HereIsMyWarning' : unreferenced label
Вы можете использовать error
Директива для этого. Следующий код выдаст ошибку во время компиляции, если DEBUG
не определено:
#ifndef DEBUG
#error This is an error message
#endif
Для GCC и Clang (и, возможно, любого компилятора, который поддерживает функцию _Pragma) вы можете определить макрос:
#if ! DEBUG
#define FIX_FOR_RELEASE(statement) _Pragma ("GCC error \"Must be fixed for release version\"")
#else
#define FIX_FOR_RELEASE(statement) statement
#endif
Вы можете использовать этот макрос для временных хаков, например, чтобы обойти код, который коллега еще не написал, чтобы убедиться, что вы не забудете исправить его, как только захотите выпустить сборку для публики. Или
FIX_FOR_RELEASE()
// Code that must be removed or fixed before you can release
или же
FIX_FOR_RELEASE(statement that must be removed or fixed before you can release);
Если вы просто хотите сообщить об ошибке:
#ifdef RELEASE
#error Release mode not allowed
#endif
будет работать с большинством компиляторов.
В Code::Blocks, если вам не нужен режим Release, вы можете удалить режим Release. Для этого нажмите на меню "Проект", выберите "Свойства", и на вкладке "Построить цели" вы можете нажать "Отпустить" и затем нажать кнопку "Удалить". Удаление режима Release делает это только для текущего проекта, поэтому вы можете использовать его в других проектах.
В противном случае, если вы действительно хотите использовать препроцессор, вы можете сделать это:
#ifdef RELEASE
#error "You have to use the Debug mode"
#endif