Path: utzoo!attcan!utgpu!news-server.csri.toronto.edu!csri.toronto.edu!norvell From: norvell@csri.toronto.edu (Theo Norvell) Newsgroups: comp.std.c Subject: Re: ANSI assert Keywords: assert, NDEBUG Message-ID: <1990Sep8.164857.2930@jarvis.csri.toronto.edu> Date: 8 Sep 90 20:48:57 GMT References: <1428@proto.COM> Organization: CSRI, University of Toronto Lines: 37 In article <1428@proto.COM> joe@proto.COM (Joe Huffman) writes: > >either someone overlooked a potential problem or my coding >style is going to have to be revised (as well as 10's of thousands of lines >of code). > >Can anyone shed some light on this for me? > >-- >joe@proto.com >FAX: 208-263-8772 No one overlooked this problem. At the September 88 meeting, this very point came up in response to a request from a prominent computer scientist who argued much as do you. It was decided that the least evil was to insist that the argument not be evaluated when NDEBUG is not defined. The reason is that it is quite reasonable for the argument to make no sense when runtime checking is on. For instance, it may use virtual variables, variables that need not exist except for checking purposes, as in void root(void) { #ifndef NDEBUG float x_init = x; #endif assert(x <= 0.0) ; ... code to find square root ... assert(abs(x_init - x*x) <= EPS) ; } Note that root is neatly specified by pre and post conditions. As has been pointed out, you may write your own assert macro. May I suggest #define assert_and_do(x) ((x) || assert(0)) Theo Norvell norvell@csri.toronto.edu