Как создать ошибку или предупреждение в препроцессоре C? - PullRequest
47 голосов
/ 08 февраля 2010

У меня есть программа, которая должна быть скомпилирована только в режиме отладки. (цель тестирования)

Как препроцессор предотвратить компиляцию в режиме RELEASE?

Ответы [ 7 ]

71 голосов
/ 08 февраля 2010

Место в любом месте:

#ifndef DEBUG
#error Only Debug builds are supported
#endif
17 голосов
/ 08 февраля 2010

C предоставляет оператор #error, и большинство компиляторов добавляют оператор #warning. Документация gcc рекомендует цитировать сообщение.

9 голосов
/ 27 мая 2015

Может быть, что-то более изощренное, но это только копирование и вставка предыдущих решений. : -)

#ifdef DEBUG        
    #pragma message ( "Debug configuration - OK" )
#elif RELEASE   
    #error "Release configuration - WRONG"
#else
    #error "Unknown configuration - DEFINITELY WRONG"
#endif

P.S. Существует также другой способ создания предупреждения. Создайте ссылку без метки, например

HereIsMyWarning:

и не ссылаться на него. Во время компиляции вы получите предупреждение типа

 1>..\Example.c(71) : warning C4102: 'HereIsMyWarning' : unreferenced label
4 голосов
/ 08 февраля 2010

Для этого вы можете использовать директиву error. Следующий код выдает ошибку во время компиляции, если DEBUG не определено:

#ifndef DEBUG
#error This is an error message
#endif
3 голосов
/ 08 февраля 2010

Если вы просто хотите сообщить об ошибке:

#ifdef RELEASE
  #error Release mode not allowed
#endif

будет работать с большинством компиляторов.

1 голос
/ 24 августа 2016

В Code :: Blocks, если вы не хотите режим Release, вы можете удалить режим Release. Для этого нажмите на меню «Проект», выберите «Свойства», и на вкладке «Построить цели» вы можете нажать «Отпустить» и затем нажать кнопку «Удалить». Удаление режима Release делает это только для текущего проекта, поэтому вы можете использовать его в других проектах.

В противном случае, если вы действительно хотите использовать препроцессор, вы можете сделать это:

#ifdef RELEASE
#error "You have to use the Debug mode"
#endif
1 голос
/ 15 февраля 2016

Для 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);
...