From: Mathieu M. <mat...@gm...> - 2007-11-08 09:39:25
|
Hi there, While browsing the vxl code I found: //: Default implementation of f is compute... double vnl_cost_function::f(vnl_vector<double> const& x) { // if we get back here from compute, neither vf was implemented. if (f_calling_compute) assert(!"vnl_cost_function: RECURSION"); ... } //: Default implementation of gradf is to call compute void vnl_cost_function::gradf(vnl_vector<double> const& x, vnl_vector<double>& g) { if (f_calling_compute) assert(!"vnl_cost_function: RECURSION"); ... } I am not sure I really understand what the code is supposed to be doing when -DNDEBUG is being defined... thanks for help, -- Mathieu |
From: Wouter K. <wo...@im...> - 2007-11-08 11:09:10
|
Mathieu Malaterre wrote: > [...] > { > if (f_calling_compute) > assert(!"vnl_cost_function: RECURSION"); > ... > } > > I am not sure I really understand what the code is supposed to be > doing when -DNDEBUG is being defined... > > thanks for help, assert() will expand to nothing, so the following code will be left: { if (f_calling_compute) ; ... } That if statement will most likely be optimised away by the compiler, as it just evaluates an integer expression with both branches doing nothing. Regards Wouter Klouwen Software Engineer, UN*X Systems Adminstrator & ... Imagineer Systems Ltd | 40 Occam Rd, Surrey Research Park http://www.imagineersystems.com/ | Guildford, GU27YG, UK |
From: Markus M. <mar...@es...> - 2007-11-08 11:25:08
|
Hi On Thursday 08 November 2007 10:39:15 Mathieu Malaterre wrote: > //: Default implementation of gradf is to call compute > void vnl_cost_function::gradf(vnl_vector<double> const& x, > vnl_vector<double>& g) > { > if (f_calling_compute) > assert(!"vnl_cost_function: RECURSION"); > ... > } > > I am not sure I really understand what the code is supposed to be > doing when -DNDEBUG is being defined... It looks like someone wanted more descriptive assertions. Note that !"string literal" always evaluates to false. So the code is supposed to abort if f_calling_compute is true. (But the user will probably see something like: assertion failed in bla.c line XXX: !"vnl_cost_function: RECURSION" instead of the less descriptive: assertion failed in bla.c line XXX: f_calling_compute (Anyway, assertions are for developers, and they should be able to find out what happened given file and line only...)) What does that have to do with the curly braces mentioned in the subject? Regards Markus -- PGP key on www.esat.kuleuven.be/~mmoll/public_key.pgp Fingerprint is 90C4 B47D 1A00 5AC1 9147 3197 EDA7 1E0E 99E4 9EDB Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm |
From: Mathieu M. <mat...@gm...> - 2007-11-08 11:28:20
|
On Nov 8, 2007 11:01 AM, Markus Moll <mar...@es...> wrote: > Hi > > On Thursday 08 November 2007 10:39:15 Mathieu Malaterre wrote: > > //: Default implementation of gradf is to call compute > > void vnl_cost_function::gradf(vnl_vector<double> const& x, > > vnl_vector<double>& g) > > { > > if (f_calling_compute) > > assert(!"vnl_cost_function: RECURSION"); > > ... > > } > > > > I am not sure I really understand what the code is supposed to be > > doing when -DNDEBUG is being defined... > > It looks like someone wanted more descriptive assertions. > Note that !"string literal" always evaluates to false. > > So the code is supposed to abort if f_calling_compute is true. > (But the user will probably see something like: > assertion failed in bla.c line XXX: !"vnl_cost_function: RECURSION" > instead of the less descriptive: > assertion failed in bla.c line XXX: f_calling_compute > (Anyway, assertions are for developers, and they should be able to find out > what happened given file and line only...)) > > What does that have to do with the curly braces mentioned in the subject? I was not simply paying attention: did not see the ending semi column...so even if assert macro is expended to nothing the remaining ; is still there... Sorry for the noise, -- Mathieu |
From: Ian S. <ian...@st...> - 2007-11-08 11:29:20
|
Mathieu Malaterre wrote: > Hi there, > > While browsing the vxl code I found: > > //: Default implementation of f is compute... > double vnl_cost_function::f(vnl_vector<double> const& x) > { > // if we get back here from compute, neither vf was implemented. > if (f_calling_compute) > assert(!"vnl_cost_function: RECURSION"); > ... > } > > //: Default implementation of gradf is to call compute > void vnl_cost_function::gradf(vnl_vector<double> const& x, > vnl_vector<double>& g) > { > if (f_calling_compute) > assert(!"vnl_cost_function: RECURSION"); > ... > } > > I am not sure I really understand what the code is supposed to be > doing when -DNDEBUG is being defined... If NDEBUG is undefined the advantage of the above colloquialism is that you get a useful error message. IF NDEBUG is defined then the code will become if (test); Since test has no side effects this does absolutely nothing, and will probably be optimised away. Since the assert indicates a structural error in your code it is appropriate to disable the test (and save the run-time cost) when building a release version. Ian. |
From: Brad K. <bra...@ki...> - 2007-11-08 14:36:35
|
Ian Scott wrote: > Mathieu Malaterre wrote: >> While browsing the vxl code I found: [snip] >> if (f_calling_compute) >> assert(!"vnl_cost_function: RECURSION"); [snip] > If NDEBUG is undefined the advantage of the above colloquialism is that > you get a useful error message. At first I was thinking this might be problematic because assert could be expanded to multiple statements. However C99 7.2.1.1/2 guarantees that the macro always expands to a "void expression". In other words it will not have any semicolons in it and will be a single expression. Therefore this is safe. > IF NDEBUG is defined then the code will become > if (test); Actually it will be more like if (test) ((void)0); but the effect is the same (see C99 7.2/1). -Brad |