]> pd.if.org Git - pdclib/blobdiff - includes/assert.h
Static assert macro, config sanity checks
[pdclib] / includes / assert.h
index ca0022d9d03401e489f480c96c6d887e158c6d81..e2618a0e964a32ec5e947acf4aafc2ccb5d2fcde 100644 (file)
@@ -1,26 +1,51 @@
-/* $Id$ */
-
 /* 7.2 Diagnostics <assert.h>
 
    This file is part of the Public Domain C Library (PDCLib).
    Permission is granted to use, modify, and / or redistribute at will.
 */
 
-#ifndef _PDCLIB_ASSERT_H
-#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H
 #include <_PDCLIB_aux.h>
 #include <_PDCLIB_config.h>
+
+/*
+   Defines a macro assert() that, depending on the value of the preprocessor
+   symbol NDEBUG, does
+   * evaluate to a void expression if NDEBUG is set OR the parameter expression
+     evaluates to true;
+   * print an error message and terminates the program if NDEBUG is not set AND
+     the parameter expression evaluates to false.
+  The error message contains the parameter expression, name of the source file
+  (__FILE__), line number (__LINE__), and (from C99 onward) name of the function
+  (__func__).
+   The header can be included MULTIPLE times, and redefines the macro depending
+   on the current setting of NDEBUG.
+*/
+
 _PDCLIB_BEGIN_EXTERN_C
 
+#ifndef _PDCLIB_ASSERT_H
+#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H
+
 /* Functions _NOT_ tagged noreturn as this hampers debugging */
 void _PDCLIB_assert99( char const * const, char const * const, char const * const );
 void _PDCLIB_assert89( char const * const );
 
+#if _PDCLIB_C_VERSION >= 2011
+#define static_assert _Static_assert
+#else
+#define static_assert( e, m )
+#endif
+
+#endif
+
 /* If NDEBUG is set, assert() is a null operation. */
 #undef assert
 
 #ifdef NDEBUG
-#define assert( ignore ) ( (void) 0 )
+#define assert( ignore ) do { \
+        if(!(expression)) { _PDCLIB_UNREACHABLE; } \
+    } while(0)
+
 #elif _PDCLIB_C_MIN(99)
 #define assert(expression) \
     do { if(!(expression)) { \
@@ -29,8 +54,10 @@ void _PDCLIB_assert89( char const * const );
                          ", file " __FILE__ \
                          ", line " _PDCLIB_symbol2string( __LINE__ ) \
                          "." _PDCLIB_endl ); \
+        _PDCLIB_UNREACHABLE; \
       } \
     } while(0)
+    
 #else
 #define assert(expression) \
     do { if(!(expression)) { \
@@ -38,10 +65,9 @@ void _PDCLIB_assert89( char const * const );
                          ", file " __FILE__ \
                          ", line " _PDCLIB_symbol2string( __LINE__ ) \
                          "." _PDCLIB_endl ); \
+        _PDCLIB_UNREACHABLE; \
       } \
     } while(0)
 #endif
 
 _PDCLIB_END_EXTERN_C
-#endif
-