www.digitalmars.com Home | Search | C & C++ | D | DMDScript | News Groups | index | prev | next
Archives

D Programming
D
D.gnu
digitalmars.D
digitalmars.D.bugs
digitalmars.D.dtl
digitalmars.D.dwt
digitalmars.D.announce
digitalmars.D.learn
digitalmars.D.debugger

C/C++ Programming
c++
c++.announce
c++.atl
c++.beta
c++.chat
c++.command-line
c++.dos
c++.dos.16-bits
c++.dos.32-bits
c++.idde
c++.mfc
c++.rtl
c++.stl
c++.stl.hp
c++.stl.port
c++.stl.sgi
c++.stlsoft
c++.windows
c++.windows.16-bits
c++.windows.32-bits
c++.wxwindows

digitalmars.empire
digitalmars.DMDScript

c++ - build-time assert for DMC++

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