"David Wilkinson" <no-reply@effisols.com> wrote in message
news:OLC3W%23X7HHA.4660@TK2MSFTNGP02.phx.gbl...
...
ostrm.put(unsigned char(0xEF)); // 1
...
It fails due to the use of unsigned char as a type in this context.
Both of the following compile correctly (not sure about running):
ostrm.put(unsigned(0xEF)); // 2
ostrm.put((unsigned char)0xEF); // 3
My 2d-worth: I'd have used the last, or maybe even
ostrm.put( (unsigned char)(0xEF) );
just because it looks like stretching things to destruction to have a
function-style cast with an apparent "function name" containing a space.
1. Is this a parsing bug in g++/Comeau?
If it is, it's not one which surprises me!
> 2. Do you think the following is correct and portable?
void XMLHelper::WriteHeader(std::ostream& ostrm)
{
ostrm << static_cast<unsigned char>(0xEFU);
ostrm << static_cast<unsigned char>(0xBBU);
ostrm << static_cast<unsigned char>(0xBFU);
ostrm << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
}
Not sure - but it looks ugly with all those <<<< :-)
My instinct for clarity and security would be
ostrm.put( (unsigned char)(0xEF) );
Alternatively, how about
typedef unsigned char __uint8;
ostrm.put( __uint8(0xEF) );
to char is undefined behavior.
"C-style cast". This certainly compiles, but may not run as intended on
some systems (in VC it works I think).