Respecting the standard

Discussion in 'C++' started by Grumble, Dec 17, 2003.

  1. Grumble

    Grumble Guest

    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.
     
    Grumble, Dec 17, 2003
    #1
    1. Advertisements

  2. Yep, both alternatives are 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.
    No, it's fine.
    If it's g++ 3.x, it's quite close.

    HTH & kind regards
    frank
     
    Frank Schmitt, Dec 17, 2003
    #2
    1. Advertisements

  3. Grumble

    tom_usenet Guest

    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.
    }
    Yes - you need to include <ostream> to use endl (although most
    I think portable programs should finish stdoutput with a newline.
    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
     
    tom_usenet, Dec 17, 2003
    #3
  4. Grumble

    Jeff Schwab Guest

    That return statement is redundant (in C++).

    As a purely academic nitpick that happened to come up here recently, you
     
    Jeff Schwab, Dec 17, 2003
    #4
  5. 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
     
    Howard Hinnant, Dec 17, 2003
    #5
  6. Grumble

    tom_usenet Guest

    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
    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!
    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
     
    tom_usenet, Dec 17, 2003
    #6
  7. <nod><flush>
    I<flush>
    agree<flush>
    <chuckle> :)

    -Howard
     
    Howard Hinnant, Dec 17, 2003
    #7
  8. On Wed, 17 Dec 2003 12:06:03 +0000, tom_usenet

    [snip]
    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
    std::cin and std::cout should do whatever stdin and stdout are
    supposed to do.
     
    Bob Hairgrove, Dec 17, 2003
    #8
  9. Grumble

    tom_usenet Guest

    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*)!).
    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
     
    tom_usenet, Dec 18, 2003
    #9
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.