
Stewart, Robert wrote:
Roland Bock wrote:
Steven Watanabe wrote:
MSVC 9.0 /W4
.\scratch.cpp(14) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) .\scratch.cpp(14) : warning C4127: conditional expression is constant .\scratch.cpp(7) : warning C4505: 'assert_helper' : unreferenced local function has been removed
OK, seems I need a sterner compiler.
s/sterner/noisier/?
C4800 seems ridiculous. Writing code using int as a Boolean is common to C code. Why would VC 9 inflict useless noise when compiling such code? Besides, if the variable is int, and it is needed in a Boolean context, what else would the developer do? I've seen use of the conditional operator to avoid that warning. I suspect that produces worse code than what is done when "forcing value to bool 'true' or 'false'."
C4505 seems useless. Why would one need to know that unused code isn't included in the object code? Either it is used and will cause a link error or it isn't and its absence isn't important. Did I miss a case?
I agree. Still, I hope that static_cast is allowed to remove C4800 and C4505 does not have a brother which talks about unreferenced classes or their methods. C4127 is a valid warning, of course. I used it to get rid of "statement has no effect" warning. I just read that that kind of warning can be gotten rid of by casting to void (works for g++ 4.2.4). So here is my new attempt (probably the last for this week): #include <cassert> #ifdef NDEBUG #ifdef assert #undef assert class assert_helper { public: static const bool check(const bool&) { return true; } }; #define assert(cond) static_cast<void>(sizeof(assert_helper::check(static_cast<bool>(cond)))); #endif #endif int main() { int i = 0; assert(i); }