URL:
  <http://gna.org/patch/?2811>

                 Summary: Static (compile-time) assert mechanism
                 Project: Freeciv
            Submitted by: jtn
            Submitted on: Sat Jul 16 23:35:33 2011
                Category: general
                Priority: 5 - Normal
                  Status: In Progress
                 Privacy: Public
             Assigned to: jtn
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
         Planned Release: 2.4.0

    _______________________________________________________

Details:

For maintainability, it's occasionally useful to be able to make the build
fail if certain conditions are not true, usually relating to build-time
tweakables or system limits.

Bug #18087 is a case in point; MAP_MAX_SIZE relies on MAX_DBV_LENGTH having a
certain minimum value, and this is currently commented, but it would be better
if the build failed hard when someone increased MAP_MAX_SIZE without noticing
the comment, rather than them having to debug some subtle failure. (OK, in
this case you run into a run-time assertion failure pretty quickly, but in
some other case you might not happen to tickle that code path in your
testing.)

This isn't a standard facility in the C language (yet), but there are a
number of well-known techniques for doing this in C, each with their
advantages and drawbacks (particularly generation of warnings, which matters
to us because we run with -Werror).

Googling found some surveys of available techniques here
<http://www.pixelbeat.org/programming/gcc/static_assert.html>, here
<http://www.jaggersoft.com/pubs/CVu11_3.html> (old!), and here
<http://bytes.com/topic/c/answers/758263-more-portable-compile-time-assert>,
for example.

I'm leaning toward this one:


#define FC_STATIC_ASSERT(cond, tag) enum { static_assert_ ## tag = 1 /
(!!(cond)) }

FC_STATIC_ASSERT(MAP_MAX_SIZE * 1000 <= MAX_DBV_LENGTH,
map_too_big_for_bitvector);


which, if it fails, throws the following error on my system:


In file included from ../packets.h:29,
                 from ../game.h:33,
                 from aisupport.c:26:
../map.h:571: error: division by zero
../map.h:571: error: enumerator value for
‘static_assert_map_too_big_for_bitvector’ is not an integer constant


Ugly, but effective.

(It's a shame this idiom doesn't map onto the
static_assert(constant-expression, "error message") pattern that's apparently
coming in a future C standard, but I haven't found a satisfactory technique
that does.)




    _______________________________________________________

Reply to this item at:

  <http://gna.org/patch/?2811>

_______________________________________________
  Message sent via/by Gna!
  http://gna.org/


_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to