std::wcout and const char *

E

Erik Knudsen

Hi!

In converting applications from ansi to unicode, it is a problem that
the std::wcout accepts a const char * without complaining compile time.

This compiles and runs:
------------------------------
const char *lookup()
{
return "Hello world";
}
std::wcout << lookup();
------------------------------

I would like it to fail compile time, so I can properly convert cases
like this to unicode in a meaningful way.

Any ideas?


Regards,
Erik Knudsen
 
S

Stefan Naewe

Hi!

In converting applications from ansi to unicode, it is a problem that
the std::wcout accepts a const char * without complaining compile time.

This compiles and runs:
------------------------------
const char *lookup()
{
return "Hello world";
}
std::wcout << lookup();
------------------------------

I would like it to fail compile time, so I can properly convert cases
like this to unicode in a meaningful way.

Any ideas?

Declare and do not define std::eek:perator<<(wostream&, char const*) yourself?

namespace std
{
inline
wostream& operator<<(wostream& wos, const char*);
}


Just an idea...


S.
 
E

Erik Knudsen

Stefan said:
Declare and do not define std::eek:perator<<(wostream&, char const*) yourself?

namespace std
{
inline
wostream& operator<<(wostream& wos, const char*);
}


Just an idea...


Thanks, but wouldn't that just give me a linker error, with no reference
to code lines?


Regards,
Erik Knudsen
 
S

Stefan Naewe

Thanks, but wouldn't that just give me a linker error, with no reference
to code lines?

Yes...but:

If I call 'g++ -g' the linker gives me the file and line number:


g++ -g -Wall wchar.cc -o wchar
/tmp/ccLf8VPM.o: In function `main':
wchar.cc:37: undefined reference to `std::eek:perator<<(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&, char const*)'
collect2: ld returned 1 exit status
make: *** [wchar] Fehler 1


HTH

S.
 
S

Stefan Naewe

Yes...but:

If I call 'g++ -g' ...

and remove the 'inline'...
the linker gives me the file and line number:


g++ -g -Wall wchar.cc -o wchar
/tmp/ccLf8VPM.o: In function `main':
wchar.cc:37: undefined reference to `std::eek:perator<<(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&, char const*)'
collect2: ld returned 1 exit status
make: *** [wchar] Fehler 1

I don't know why I put 'inline' there a all...

S.
 
J

James Kanze

On 12/11/2007 10:16 AM, Erik Knudsen wrote:
Declare and do not define std::eek:perator<<(wostream&, char
const*) yourself?
namespace std
{
inline
wostream& operator<<(wostream& wos, const char*);
}
Just an idea...

That's undefined behavior. You're not allowed to define new
free functions in a std::.

The standard std::wostream defines an operator<< for char
const*. You have to assume that some of the other operator<<
for wostream may use it, so you really have to leave it.
 
S

Stefan Naewe

That's undefined behavior. You're not allowed to define new
free functions in a std::.

I knew someone would say that...

But really: Who cares in this case if it just works (with some
modifications and only (?) with g++ (see my other post)) ?

The standard std::wostream defines an operator<< for char
const*. You have to assume that some of the other operator<<
for wostream may use it, so you really have to leave it.


S.
 
J

James Kanze

On 12/12/2007 1:41 PM, James Kanze wrote:
I knew someone would say that...
But really: Who cares in this case if it just works (with some
modifications and only (?) with g++ (see my other post)) ?

Does it work? It might, or it might not. Or it might work some
of the time, and not others. There are things you can
reasonably define in std::, and expect to get away with it. But
this isn't one of them.

And that is why. If you declare your version of the function,
either:

-- The only version in the standard library is the template
version. Your version overloads it, and since it is not a
template, has precedence in operator overload resolution.
If the library has overloaded the << operator for, say,
complex with something like:

template< typename Float, typename CharT ... >
std::basic_ostream< CharT ... >&
operator<<( std::basic_ostream< CharT ... >& dest,
std::complex< Float > const& z )
{
dest << "(" << z.real() << "," << z.imag() << ")" ;
return dest ;
}

then this function may call your version, rather than the
standard one; which one will be chosen more or less
randomly.

-- If the standard library has also declared the function
(which would seem a more or less likely "optimization" for
the usual cases of std::eek:stream and std::wostream), then
your declaration just duplicates the one in the standard
library, and doesn't change anything.

The standard limits what you can do in std:: for a very real
reason.
 
P

Pete Becker

Does it work? It might, or it might not. Or it might work some
of the time, and not others. There are things you can
reasonably define in std::, and expect to get away with it. But
this isn't one of them.

But as a short-term debugging aid, this is fine: if it detects
problems, you fix them. Once you've done that, you remove it. I've
occasionally gone so far as to add #error statements to standard
headers when I couldn't figure out why some header was being included
in a bogus context. (One of the Windows headers pulls in <stdlib.h>
while inside an extern "C" block. Sigh.)
 
E

Erik Knudsen

Pete said:
But as a short-term debugging aid, this is fine: if it detects problems,
you fix them. Once you've done that, you remove it. I've occasionally
gone so far as to add #error statements to standard headers when I
couldn't figure out why some header was being included in a bogus
context. (One of the Windows headers pulls in <stdlib.h> while inside an
extern "C" block. Sigh.)


I will only use it as a short term porting/debugging aid. However, I use
VC++ 2005, and it doesn't give me the line numbers for a link error.


Regards,
Erik Knudsen
 
E

Erik Knudsen

Ok, so far the best approach has been to comment out the std stream
operators for char *, void * and bool from the stl include files - that
made the compiler complain when we tried to stream a char *.

However, I'm still looking for a nicer approach...


Regards,
Erik Knudsen
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top