What is the NDEBUG preprocessor macro used for (on different platforms)?

Martin Ba picture Martin Ba · Mar 29, 2011 · Viewed 41k times · Source

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 NDEBUGfor their debug related stuff.

Answer

Michael Burr picture Michael Burr · Mar 29, 2011

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.