c++ - build-time assert for DMC++
- Larry Brasfield (39/39) Oct 11 2002 After struggling with other methods for effecting
After struggling with other methods for effecting a compile-time assert facility, I saw how the boost library does it. Their technique does not quite work on DMC++ either, but a similar one does. Here is the content of a header which will allow compile-time constant expressions to be evaluated and fail the build if their value comes up false or 0: ================================================ // Build-time assert facility #ifndef BUILD_ASSERT #define BUILD_ASSERT( B ) typedef int \ BUILD_ASSERT[ sizeof(BUILD_ASSERT_CHECK< static_cast<bool>( B ) >) ] template <bool x> struct BUILD_ASSERT_CHECK; template <> struct BUILD_ASSERT_CHECK<true> {}; #endif // BUILD_ASSERT ================================================ There is one remaining non-critical problem. If there are multiple uses of BUILD_ASSERT in one translation unit, and some fail but others don't, there will be more complaints from the compiler than there are failed assertions. I would have excluded this, but the compiler's preprocessor is (defectively) unable to incorporate the __LINE__ macro into a token-pasted identifier. Usage is pretty simple. Example: #include "build_assert.h" struct Goober { char notpad; double number; }; // If this fails, alignment must have changed. BUILD_ASSERT(sizeof(Goober) == 12); Note that the assertion failure is somewhat cryptic, making it a good idea to comment the assertion. -- -Larry Brasfield (address munged, s/sn/h/ to reply)
Oct 11 2002