Re: Compiler Warning C4706: assignment within conditional expression
On Tue, 6 Nov 2007 10:15:00 -0800, Paul <vhr@newsgroups.nospam> wrote:
This is the code fragment
---------------------------------------------------------------
std::string output;
DWORD bytes_avail = 0;
if (::PeekNamedPipe(h_read, 0, 0, 0, &bytes_avail, 0))
if (bytes_avail > 0) {
const DWORD len = 4096;
char buf[len];
DWORD bytes_read;
BOOL rfr;
while ((rfr = ::ReadFile(h_read, buf, len, &bytes_read, 0) &&
bytes_read))
output.append(buf, buf + bytes_read);
if (!rfr)
switch (const DWORD e = ::GetLastError()) {
case ERROR_BROKEN_PIPE: // 109: The pipe has been ended
break;
default:
Log(ERR, "ReadFile failed: " + get_last_error(e));
}
}
---------------------------------------------------------------
in which
rfr = ::ReadFile(h_read, buf, len, &bytes_read, 0)
in while() causes Compiler Warning C4706 (assignment within conditional
expression).
That's not quite what your code says:
while ((rfr = ::ReadFile(h_read, buf, len, &bytes_read, 0) && bytes_read))
You're assigning rfr the value of the logical-and-expression, not just the
ReadFile call.
My interest here is obviously purely academic but is there a way
to write the condition in the while() in a way that would tell the compiler
the warning has been heeded and it is all right? (The reason I use this
assignment is to take the return code out of the condition and test it when
the loop terminates in case ReadFile has failed.)
I am familiar with this
http://msdn2.microsoft.com/en-us/library/7hw7c1he(VS.80).aspx
but writing
(rfr = ::ReadFile(h_read, buf, len, &bytes_read, 0)) != 0
That's very different than what you presented above.
does not help either in VS2003 or VS2005 and I had rather not use
#pragma warning (disable:...)
...
#pragma warning (default:...)
Comparing to zero is about all there is, except for restructuring your
loop.
--
Doug Harrison
Visual C++ MVP