Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Respecting the standard

Reply
Thread Tools

Respecting the standard

 
 
Grumble
Guest
Posts: n/a
 
      12-17-2003
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.

 
Reply With Quote
 
 
 
 
Frank Schmitt
Guest
Posts: n/a
 
      12-17-2003
Grumble <(E-Mail Removed)> 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
 
Reply With Quote
 
 
 
 
tom_usenet
Guest
Posts: n/a
 
      12-17-2003
On Wed, 17 Dec 2003 10:44:09 +0100, Grumble <(E-Mail Removed)>
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
 
Reply With Quote
 
Jeff Schwab
Guest
Posts: n/a
 
      12-17-2003
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.
>


 
Reply With Quote
 
Howard Hinnant
Guest
Posts: n/a
 
      12-17-2003
In article <(E-Mail Removed)>,
tom_usenet <(E-Mail Removed)> 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
 
Reply With Quote
 
tom_usenet
Guest
Posts: n/a
 
      12-17-2003
On Wed, 17 Dec 2003 14:29:26 GMT, Howard Hinnant
<(E-Mail Removed)> wrote:

>In article <(E-Mail Removed)>,
> tom_usenet <(E-Mail Removed)> 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 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
 
Reply With Quote
 
Howard Hinnant
Guest
Posts: n/a
 
      12-17-2003
In article <(E-Mail Removed)>,
tom_usenet <(E-Mail Removed)> 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
 
Reply With Quote
 
Bob Hairgrove
Guest
Posts: n/a
 
      12-17-2003
On Wed, 17 Dec 2003 12:06:03 +0000, tom_usenet
<(E-Mail Removed)> 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
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
tom_usenet
Guest
Posts: n/a
 
      12-18-2003
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
><(E-Mail Removed)> 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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
DataGrid paging-- OnItemCommand not respecting page number? Steve Hershoff ASP .Net 0 08-09-2006 09:06 PM
split a line, respecting double quotes Jim Python 8 07-10-2006 03:55 PM
respecting others Gary and Terrie Meerschaert Computer Support 19 04-11-2005 09:38 PM
Tomcat in a cluster respecting jsessionid johndesp Java 0 05-07-2004 12:18 AM
nestscape respecting floats Shawn Modersohn HTML 2 04-27-2004 09:53 AM



Advertisments