Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Chess programming puzzle

Author: Dann Corbit

Date: 12:50:21 02/22/05

Go up one level in this thread


On February 22, 2005 at 15:45:02, Tom Likens wrote:
[snip]
>Tim,
>
>You could make this slightly shorter by declaring main void and getting rid
>of that "return 0" at the end! ;-)

From the C-FAQ:
1.25b:  What's the right declaration for main()?
        Is void main() correct?

A:      See questions 11.12a through 11.15.  (But no, it's not correct.)

11.12a: What's the correct declaration of main()?

A:      Either int main(), int main(void), or int main(int argc,
        char *argv[]) (with alternate spellings of argc and *argv[]
        obviously allowed).  See also questions 11.12b to 11.15 below.

        References: ISO Sec. 5.1.2.2.1, Sec. G.5.1; H&S Sec. 20.1 p.
        416; CT&P Sec. 3.10 pp. 50-51.

11.12b: Can I declare main() as void, to shut off these annoying
        "main returns no value" messages?

A:      No.  main() must be declared as returning an int, and as
        taking either zero or two arguments, of the appropriate types.
        If you're calling exit() but still getting warnings, you may
        have to insert a redundant return statement (or use some kind
        of "not reached" directive, if available).

        Declaring a function as void does not merely shut off or
        rearrange warnings: it may also result in a different function
        call/return sequence, incompatible with what the caller (in
        main's case, the C run-time startup code) expects.

        (Note that this discussion of main() pertains only to "hosted"
        implementations; none of it applies to "freestanding"
        implementations, which may not even have main().  However,
        freestanding implementations are comparatively rare, and if
        you're using one, you probably know it.  If you've never heard
        of the distinction, you're probably using a hosted
        implementation, and the above rules apply.)

        References: ISO Sec. 5.1.2.2.1, Sec. G.5.1; H&S Sec. 20.1 p.
        416; CT&P Sec. 3.10 pp. 50-51.

11.14a: I believe that declaring void main() can't fail, since I'm
        calling exit() instead of returning, and anyway my operating
        system ignores a program's exit/return status.

A:      It doesn't matter whether main() returns or not, or whether
        anyone looks at the status; the problem is that when main() is
        misdeclared, its caller (the runtime startup code) may not even
        be able to *call* it correctly (due to the potential clash of
        calling conventions; see question 11.12b).

        Your operating system may ignore the exit status, and
        void main() may work for you, but it is not portable and not
        correct.

11.14b: So what could go wrong?  Are there really any systems where
        void main() doesn't work?

A:      It has been reported that programs using void main() and
        compiled using BC++ 4.5 can crash.  Some compilers (including
        DEC C V4.1 and gcc with certain warnings enabled) will complain
        about void main().

11.15:  The book I've been using, _C Programing for the Compleat Idiot_,
        always uses void main().

A:      Perhaps its author counts himself among the target audience.
        Many books unaccountably use void main() in examples, and assert
        that it's correct.  They're wrong.



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.