|
Boost : |
From: scleary_at_[hidden]
Date: 2000-12-18 10:14:10
> Indeed, if a compiler came out that actually had problems with assert
> (), I claim that that compiler could not be successful, based on the
> widespread use of assert().
The problem only occurs when assert() is used in header files. There are no
ODR problems with assert() in non-included files.
> Another point -- boost is full of ODR violations! Any inline or
> template code that is conditioned on some compile-time variable
> violates the ODR, doesn't it?
No. Different template parameter values -> different (mangled) symbol names
-> no ODR problems.
ODR problems surface when code in header files is different based on
preprocessor symbols that are not equivalent across all translation units.
There are several ways around this:
. Make code dependent on template parameters instead of preprocessor
symbols; this makes for messy user code. :(
. Suggest a "restriction" that all preprocessor symbols are the same
across all translation units. The problem is that there's no way to enforce
this restriction.
. Place all code that is dependent on changeable preprocessor symbols
(meaning NDEBUG, not __WIN32__) in a non-included file, and have two Boost
libraries: debug and release. This may discourage the compiler from
inlining.
. Try to get the unnamed namespace thing working. I haven't had the time
to look at this and see if it's a viable solution.
Again, I would really *like* to see a solution developed here; I think it
would be very useful!
-Steve
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk