C/C++: Портативный способ обнаружить отладку / выпуск?

Существует ли стандартизированный (например, реализован всеми главными компиляторами) #define, который позволит мне различать отладку и сборки конечных версий?

16
задан sivabudh 12 February 2010 в 02:21
поделиться

3 ответа

Edit: Я неправильно понял вопрос и ушел по другой касательной!!! Извиняюсь... Макрос _NDEBUG используется как в Linux, так и в Windows...

Если бинарник собран и вам нужно определить, была ли сборка release/debug, вы можете получить шестнадцатеричный дамп, если вы увидите в нем много символов, которые будут отладочной информацией... например, в Linux, используя утилиту strings. Существует версия для Windows от SysInternals, доступная здесь на technet. Релизные версии двоичных исполняемых файлов не будут иметь строк, представляющих различные символы...

strings some_binary

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0
ответ дан 30 November 2019 в 22:02
поделиться

Поскольку нет стандартного определения отладки или выпуска, нет способа сделать это. Я могу придумать, по крайней мере, четыре разных вещи, которые можно было бы иметь в виду, и все они могут быть изменены независимо. Только два могут быть протестированы из кода.

  1. Уровень оптимизации компилятора
  2. Отладочные символы включены в двоичный файл (их можно даже удалить позже)
  3. assert () включен (NDEBUG не определен)
  4. ведение журнала отключено
3
ответ дан 30 November 2019 в 22:02
поделиться

если верить

 #ifdef NDEBUG
  // nondebug
 #else
  // debug code
 #endif

наиболее переносимым.

Но ни один компилятор не знает, компилируете ли вы debug или release, так что это не автоматически. Но этот параметр используется assert.h в c-runtime, так что он довольно распространен. Visual Studio установит его, и я уверен, что большинство других IDE тоже.

19
ответ дан 30 November 2019 в 22:02
поделиться