Browse Source

static_assert - portable solution compatible with C++98

Robert Pelnar 5 years ago
parent
commit
e50025cc7d
3 changed files with 27 additions and 0 deletions
  1. 1 0
      Firmware/menu.cpp
  2. 23 0
      Firmware/static_assert.h
  3. 3 0
      Firmware/ultralcd.cpp

+ 1 - 0
Firmware/menu.cpp

@@ -10,6 +10,7 @@
 #include "Marlin.h"
 #include "ultralcd.h"
 #include "language.h"
+#include "static_assert.h"
 
 
 

+ 23 - 0
Firmware/static_assert.h

@@ -0,0 +1,23 @@
+//static_assert.h
+//portable solution compatible with C++98
+
+#if (__cplusplus < 201103L) //std < C++11
+
+//source http://www.pixelbeat.org/programming/gcc/STATIC_ASSERT.html
+#define ASSERT_CONCAT_(a, b) a##b
+#define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
+
+// These can't be used after statements in c89.
+#ifdef __COUNTER__
+  #define static_assert(e,m) \
+    ;enum { ASSERT_CONCAT(STATIC_ASSERT_, __COUNTER__) = 1/(int)(!!(e)) }
+#else
+  //This can't be used twice on the same line so ensure if using in headers
+  //that the headers are not included twice (by wrapping in #ifndef...#endif)
+  //Note it doesn't cause an issue when used on same line of separate modules
+  //compiled with gcc -combine -fwhole-program.
+  #define static_assert(e,m) \
+    ;enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(int)(!!(e)) }
+#endif //__COUNTER__
+
+#endif //(__cplusplus < 201103L)

+ 3 - 0
Firmware/ultralcd.cpp

@@ -37,6 +37,9 @@
 
 #include "mmu.h"
 
+#include "static_assert.h"
+
+
 extern bool fans_check_enabled;