I'm interested in what purpose various platforms / compilers ("implementations") / frameworks assign to the the C and C++ preprocessor macro NDEBUG
.
The C as well as the C++ standard only mention this definition once, namely to control the behavior of the assert()
macro.
I would ask to include only specific answers, where you know that a certain platform / framework / library for C or C++ uses the NDEBUG
definition to enable or disable anything else in addition to the standard defined assert()
macro.
One reason for asking this question has been that MS (Visual-C++) always(?) uses "their" _DEBUG
define to distinguish between debug and release stuff and I was wondering if this is a common practice for a library / platform to have their "own" debug define or whether other libraries / platforms use NDEBUG
for their debug related stuff.
The only 'standard' thing about NDEBUG
is that it's used to control whether the assert
macro will expand into something that performs a check or not. MSVC helpfully defines this macro in release build configurations by defining it in the project for you. You can change that manually by editing the project configuration. Other toolchains might (or might not) do something similar.
Note that you can also change the state of the NDEBUG
macro within a translation unit (source file) using #define
and/or #undef
on NDEBUG
and re-include assert.h
to change how the assert
macro behaves (turn it on and off). That behavior is mandated by the standard, and is the only time (I think) where the standard permits including a standard header a second time to change the behavior of compilation after the second inclusion.