473,387 Members | 1,520 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

std::wcout and const char *

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
Dec 11 '07 #1
10 3365
On 12/11/2007 10:16 AM, Erik Knudsen wrote:
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::operator<<(wostream&, char const*) yourself?

namespace std
{
inline
wostream& operator<<(wostream& wos, const char*);
}
Just an idea...
S.
--
Stefan Naewe stefan dot naewe at atlas-elektronik dot com
Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html
Plain text mails only, please http://www.expita.com/nomime.html
Dec 11 '07 #2
Stefan Naewe wrote:
>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::operator<<(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
Dec 12 '07 #3
On 12/12/2007 10:01 AM, Erik Knudsen wrote:
Stefan Naewe wrote:
>>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::operator<<(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?
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::operator<<(std::basic_ostream<wchar_t, std::char_traits<wchar_t&, char const*)'
collect2: ld returned 1 exit status
make: *** [wchar] Fehler 1
HTH

S.
--
Stefan Naewe stefan dot naewe at atlas-elektronik dot com
Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html
Plain text mails only, please http://www.expita.com/nomime.html
Dec 12 '07 #4
On 12/12/2007 10:11 AM, Stefan Naewe wrote:
On 12/12/2007 10:01 AM, Erik Knudsen wrote:
>Stefan Naewe wrote:
>>>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::operator<<(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?

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::operator<<(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.
--
Stefan Naewe stefan dot naewe at atlas-elektronik dot com
Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html
Plain text mails only, please http://www.expita.com/nomime.html
Dec 12 '07 #5
On Dec 11, 10:51 am, Stefan Naewe <nos...@please.netwrote:
On 12/11/2007 10:16 AM, Erik Knudsen wrote:
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::operator<<(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.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Dec 12 '07 #6
On 12/12/2007 1:41 PM, James Kanze wrote:
On Dec 11, 10:51 am, Stefan Naewe <nos...@please.netwrote:
>On 12/11/2007 10:16 AM, Erik Knudsen wrote:
>>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::operator<<(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::.
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.
--
Stefan Naewe stefan dot naewe at atlas-elektronik dot com
Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html
Plain text mails only, please http://www.expita.com/nomime.html
Dec 12 '07 #7
On Dec 12, 2:40 pm, Stefan Naewe <nos...@please.netwrote:
On 12/12/2007 1:41 PM, James Kanze wrote:
On Dec 11, 10:51 am, Stefan Naewe <nos...@please.netwrote:
On 12/11/2007 10:16 AM, Erik Knudsen wrote:
>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::operator<<(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::.
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.
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.
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::ostream 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.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Dec 12 '07 #8
On 2007-12-12 10:28:09 -0500, James Kanze <ja*********@gmail.comsaid:
On Dec 12, 2:40 pm, Stefan Naewe <nos...@please.netwrote:
>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.
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.)

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Dec 12 '07 #9
Pete Becker wrote:
>
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.hwhile 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
Dec 13 '07 #10
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
Erik Knudsen wrote:
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
Dec 14 '07 #11

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Alex Mizrahi | last post by:
Hello, All! i admit that it's better to ask questions connected with atl/mfc classes in special newsgroups, but seems like people there are interested more in discussing stuff like MFC GUI than...
7
by: jalkadir | last post by:
WinXP P3 MinWing-GCC-3.4.3 When compiling the program below, I get a message that reads: wcout' is not a member of `std' What am I doing wrong? This message popping up too often!! >:( TIA
3
by: Steven T. Hatton | last post by:
There's probably something obvious I'm missing here, but I can't seem to figure out how to get this to work: ostream_iterator<wstring, wchar_t>(wcout,"\n")); When I try to compile it, I get an...
1
by: iwongu | last post by:
Hi, I have a question about std::wcout and its underlying C functions. According to C99, a stream have an orientation type that is one of byte-oriented or wide-one, and it is determined by the...
2
by: Ralf Goertz | last post by:
Hi, can I mix output to cout and wcout? It seems that if I write to cout first it works fine but if I start with wcout the output to cout vanishes. I assume that is has to do with the...
2
by: year1943 | last post by:
There was the same topic not so long ago, but as I see it stays w/o answer:...
44
by: Ioannis Vranos | last post by:
Has anyone actually managed to print non-English text by using wcout or wprintf and the rest of standard, wide character functions?
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.