Как мне сгенерировать ошибку или предупреждение в препроцессоре 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
Другие вопросы по тегам