When you're writing a program, it's often a good idea to put in checks at strategic places for ``impossible'' errors or violations of basic assumptions. These checks are helpful in debugging problems due to misunderstandings between different parts of the program.
The assert
macro, defined in the header file `assert.h', provides a convenient way to abort the program while printing a message about where in the program the error was detected.
Once you think your program is debugged, you can disable the error checks performed by the assert
macro by recompiling with the macro NDEBUG
defined. This means you don't actually have to change the program source code to disable these checks.
But disabling these consistency checks is undesirable unless they make the program significantly slower. All else being equal, more error checking is good no matter who is running the program. A wise user would rather have a program crash, visibly, than have it return nonsense without indicating anything might be wrong.
If NDEBUG
is not defined, assert
tests the value of expression. If it is false (zero), assert
aborts the program (see Aborting a Program) after printing a message of the form:
`file':linenum: Assertion `expression' failed.
on the standard error stream stderr
(see Standard Streams). The filename and line number are taken from the C preprocessor macros __FILE__
and __LINE__
and specify where the call to assert
was written.
If the preprocessor macro NDEBUG
is defined at the point where `assert.h' is included, the assert
macro is defined to do absolutely nothing.
Warning: Even the argument expression expression is not evaluated if NDEBUG
is in effect. So never use assert
with arguments that involve side effects. For example, assert (++i > 0);
is a bad idea, because i
will not be incremented if NDEBUG
is defined.
Usage note: The assert
facility is designed for detecting internal inconsistency; it is not suitable for reporting invalid input or improper usage by the user of the program.
The information in the diagnostic messages printed by the assert
macro is intended to help you, the programmer, track down the cause of a bug, but is not really useful for telling a user of your program why his or her input was invalid or why a command could not be carried out. So you can't use assert
to print the error messages for these eventualities.
What's more, your program should not abort when given invalid input, as assert
would do---it should exit with nonzero status (see Exit Status) after printing its error messages, or perhaps read another command or move on to the next input file.
See Error Messages, for information on printing error messages for problems that do not represent bugs in the program.