By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,655 Members | 1,005 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,655 IT Pros & Developers. It's quick & easy.

Respecting the standard

P: n/a
Hello,

I was recently told that there were <quote>a lot of things
wrong</quote> with the following program:

#include <iostream>

int main()
{
cout << '\a';
return 0;
}

I believe I should have written std::cout instead of cout.
Alternatively, I think I could have written:

using namespace std; // I can now write 'cout' and 'endl'

Second, I might need to write a newline to cout, otherwise the input
might be discarded, is that correct?

I'll make these two adjustments:

#include <iostream>

int main()
{
std::cout << '\a' << std::endl;
return 0;
}

Do you see anything wrong with this program as far as standard C++
is concerned? Did I really need to write endl to cout?

g++ -ansi -pedantic -Wall -W foo.cxx does not give any warning, but
I don't know how closely g++ adheres to the standard.

Jul 22 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
On Wed, 17 Dec 2003 10:44:09 +0100, Grumble <in*****@kma.eu.org>
wrote:
Hello,

I was recently told that there were <quote>a lot of things
wrong</quote> with the following program:

#include <iostream>

int main()
{
cout << '\a';
return 0;
}

I believe I should have written std::cout instead of cout.
Alternatively, I think I could have written:

using namespace std; // I can now write 'cout' and 'endl'

Second, I might need to write a newline to cout, otherwise the input
might be discarded, is that correct?

I'll make these two adjustments:

#include <iostream>

int main()
{
std::cout << '\a' << std::endl;
return 0;
}
Well, I'd adjust it to:

#include <iostream>
#include <ostream> //required for non-members

int main()
{
std::cout << "\a\n";
return 0;
//cout implicitly flushed on program exit.
}
Do you see anything wrong with this program as far as standard C++
is concerned?
Yes - you need to include <ostream> to use endl (although most
compilers don't care if <iostream> is included).
Did I really need to write endl to cout?
I think portable programs should finish stdoutput with a newline.
g++ -ansi -pedantic -Wall -W foo.cxx does not give any warning, but
I don't know how closely g++ adheres to the standard.


The latest version is pretty close.

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Jul 22 '05 #2

P: n/a
Grumble <in*****@kma.eu.org> writes:
Hello,

I was recently told that there were <quote>a lot of things
wrong</quote> with the following program:

#include <iostream>

int main()
{
cout << '\a';
return 0;
}

I believe I should have written std::cout instead of
cout. Alternatively, I think I could have written:

using namespace std; // I can now write 'cout' and 'endl'
Yep, both alternatives are correct.
Second, I might need to write a newline to cout, otherwise the input
might be discarded, is that correct?
ITYM output instead of input - it doesn't get discarded, but the output
buffer will not necessarily be flushed, so it will look like it got
discarded.

I'll make these two adjustments:

#include <iostream>

int main()
{
std::cout << '\a' << std::endl;
return 0;
}

Do you see anything wrong with this program as far as standard C++ is
concerned?
No, it's fine.
Did I really need to write endl to cout?

g++ -ansi -pedantic -Wall -W foo.cxx does not give any warning, but I
don't know how closely g++ adheres to the standard.


If it's g++ 3.x, it's quite close.

HTH & kind regards
frank

--
Frank Schmitt
4SC AG phone: +49 89 700763-0
e-mail: frankNO DOT SPAMschmitt AT 4sc DOT com
Jul 22 '05 #3

P: n/a
Grumble wrote:
Hello,

I was recently told that there were <quote>a lot of things wrong</quote>
with the following program:

#include <iostream>

int main()
{
cout << '\a';
return 0;
That return statement is redundant (in C++).

As a purely academic nitpick that happened to come up here recently, you
might need to include <ostream> if you want to use std::endl and keep
the program portable.
}

I believe I should have written std::cout instead of cout.
Alternatively, I think I could have written:

using namespace std; // I can now write 'cout' and 'endl'

Second, I might need to write a newline to cout, otherwise the input
might be discarded, is that correct?

I'll make these two adjustments:

#include <iostream>

int main()
{
std::cout << '\a' << std::endl;
return 0;
}

Do you see anything wrong with this program as far as standard C++ is
concerned? Did I really need to write endl to cout?

g++ -ansi -pedantic -Wall -W foo.cxx does not give any warning, but I
don't know how closely g++ adheres to the standard.


Jul 22 '05 #4

P: n/a
In article <ud********************************@4ax.com>,
tom_usenet <to********@hotmail.com> wrote:
Well, I'd adjust it to:

#include <iostream>
#include <ostream> //required for non-members

int main()
{
std::cout << "\a\n";
return 0;
//cout implicitly flushed on program exit.
}


Just curious: Have you come across any implementation where the
<ostream> is actually required? There is considerable debate on whether
we really want to break every single C++ text which has shown the
traditional "HelloWorld" with only <iostream>. ;-)

Martin Sebor has done an admirable job of trying to bring this issue to
the committee. Unfortunately I don't think he has entirely succeeded
yet.

-Howard
Jul 22 '05 #5

P: n/a
On Wed, 17 Dec 2003 14:29:26 GMT, Howard Hinnant
<hi*****@metrowerks.com> wrote:
In article <ud********************************@4ax.com>,
tom_usenet <to********@hotmail.com> wrote:
Well, I'd adjust it to:

#include <iostream>
#include <ostream> //required for non-members

int main()
{
std::cout << "\a\n";
return 0;
//cout implicitly flushed on program exit.
}
Just curious: Have you come across any implementation where the
<ostream> is actually required?


Nope, other than the Deathstation 9000. I thought that Dietmar's cxxrt
might be one, but it too includes <istream> and <ostream> in
<iostream>.

There is considerable debate on whetherwe really want to break every single C++ text which has shown the
traditional "HelloWorld" with only <iostream>. ;-)
Many hello world programs seem to use std::endl for no good reason,
and I could certainly envision an implementation that doesn't expose
endl unless ostream is explicitly included. But not to include the
non-member operator<<'s (for char*) would be a bit crazed - hello
world output would become a random pointer value!
Martin Sebor has done an admirable job of trying to bring this issue to
the committee. Unfortunately I don't think he has entirely succeeded
yet.


Good luck to him! It doesn't seem very important though, just ironic
that the canonical hello world program relies on unspecified
behaviour.

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Jul 22 '05 #6

P: n/a
In article <1i********************************@4ax.com>,
tom_usenet <to********@hotmail.com> wrote:
Many hello world programs seem to use std::endl for no good reason
<nod><flush>
I<flush>
agree<flush>
100%!<flush>
just ironic
that the canonical hello world program relies on unspecified
behaviour.


<chuckle> :-)

-Howard
Jul 22 '05 #7

P: n/a
On Wed, 17 Dec 2003 12:06:03 +0000, tom_usenet
<to********@hotmail.com> wrote:

[snip]
Do you see anything wrong with this program as far as standard C++
is concerned?


Yes - you need to include <ostream> to use endl (although most
compilers don't care if <iostream> is included).


The header synopsis for <iostream> (section 27.3) declares std::cout
as "extern ostream cout;" in namespace std. std::cin is declared as
"extern istream cin;" Therefore, it must include both <istream> and
<ostream>, as far as I can tell.
Did I really need to write endl to cout?


I think portable programs should finish stdoutput with a newline.


std::cin and std::cout should do whatever stdin and stdout are
supposed to do.
g++ -ansi -pedantic -Wall -W foo.cxx does not give any warning, but
I don't know how closely g++ adheres to the standard.


The latest version is pretty close.

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html


--
Bob Hairgrove
No**********@Home.com
Jul 22 '05 #8

P: n/a
On Wed, 17 Dec 2003 20:20:48 GMT, wouldnt_you_like@to_know.com (Bob
Hairgrove) wrote:
On Wed, 17 Dec 2003 12:06:03 +0000, tom_usenet
<to********@hotmail.com> wrote:

[snip]
Do you see anything wrong with this program as far as standard C++
is concerned?
Yes - you need to include <ostream> to use endl (although most
compilers don't care if <iostream> is included).


The header synopsis for <iostream> (section 27.3) declares std::cout
as "extern ostream cout;" in namespace std. std::cin is declared as
"extern istream cin;" Therefore, it must include both <istream> and
<ostream>, as far as I can tell.


Nope, it just needs complete definitions of basic_istream and
basic_ostream (and the typedefs istream and ostream). Imagine if
<istream> is just

#include <iosfwd>
#include <impl/istream_core.h>
#include <impl/istream_non_members.h>
and <iostream> is

#include <iosfwd>
#include <impl/istream_core.h>
extern istream cin;
extern wistream wcin;
//...

Now you don't get std::endl (or operator<<(ostream, char const*)!).
Did I really need to write endl to cout?


I think portable programs should finish stdoutput with a newline.


std::cin and std::cout should do whatever stdin and stdout are
supposed to do.


Right, it is implementation defined (according to the C standard)
whether text streams (such as stdout) require a terminating newline
character.

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Jul 22 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.