Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

если верить

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

является самым портативным.

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

Ответ 2

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

  • Уровень оптимизации компилятора
  • Отладочные символы, включенные в двоичный файл (они могут быть удалены позже)
  • assert() включен (NDEBUG не определен)
  • отключен журнал

Ответ 3

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

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

strings some_binary

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