Respecting the standard

G

Grumble

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.
 
F

Frank Schmitt

Grumble said:
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
 
T

tom_usenet

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 said:
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
 
J

Jeff Schwab

Grumble said:
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
 
H

Howard Hinnant

tom_usenet said:
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
 
T

tom_usenet

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 whether
we 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
 
H

Howard Hinnant

tom_usenet said:
Many hello world programs seem to use std::endl for no good reason

<nod><flush>
I<flush>
agree<flush>
100%! said:
just ironic
that the canonical hello world program relies on unspecified
behaviour.

<chuckle> :)

-Howard
 
B

Bob Hairgrove

On Wed, 17 Dec 2003 12:06:03 +0000, tom_usenet

[snip]
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
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.
 
T

tom_usenet

On Wed, 17 Dec 2003 12:06:03 +0000, tom_usenet

[snip]
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*)!).
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
 

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

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top