linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Steve Graegert <graegerts@gmail.com>
To: _z33 <timid.Gentoo@gmail.com>
Cc: linux-c-programming@vger.kernel.org
Subject: Re: default function parameters
Date: Fri, 9 Sep 2005 11:34:23 +0200	[thread overview]
Message-ID: <6a00c8d505090902345d74646c@mail.gmail.com> (raw)
In-Reply-To: <dfri55$cse$1@sea.gmane.org>

On 9/9/05, _z33 <timid.Gentoo@gmail.com> wrote:
> Steve Graegert wrote:
> 
> > Unless you're writing a compiler this does not matter.  Even if an int
> > argument in implicitly used it has no meaning to the programmer.
> > Since void is a well defined type, although an incomplete one, I have
> > doubts that int is used internally.  I simply can't see the rationale
> > behind that (but I'd be happy to be enlightened).  Could you please
> > try to transport your collegue's argumentation?
> 
> Here is what he sent me -
> 
>        #include <stdio.h>
> 
>        void add ()
>        {
>             printf ("inside function: add. \n");
> 
>             return;
>        }
> 
>        int main (void)
>        {
>            /* call function add with some parameters */
>            add (5, 1);
> 
>            system ("PAUSE");
> 
>            return (0);
>        }

add is defined as a function that can take an arbitrary number of
arguments, since no args are defined (not even void).

OK, so what happens here?  Calling add with an arbitrary number of
arguments is fairly legal, but since no prototype is declared and no
arguments are defined for add, the arguments are discarded (i.e.
nothing is pushed on the stack).

I have modified the code to clarify my thoughts:

	#include <stdio.h>

	/* prototype */
	void add(); /* call with arbitrary number of arguments */

	void add (int a, int b, int c) {
		printf ("inside function: add(%d, %d)\n", a, b);
		return;
	}

	int main (void) {
		/* call function add with some parameters */
		add(5, 1);
		getc(stdin);

		return (0);
	}

Do you see the difference?  No warning is issued, because there is
nothing wrong with it (it is not recommended by ANSI C99 but still
valid).

>   How can this work, if not specifying any argument, is equivalent to
> specifying as void?

What we see here is the "old" style of using some kind of variadic
functions.  Specifying void here indicates we do not intend to use the
old style, but ANSI C instead.  The compiler is smart enough and does
not issue a warning.

>   However, one thing I was able observe was that it accepts any kind of
> arguments, and also any number of arguments, as against his theory of
> only accepting "int" types.

As stated above: this is the old pre-ANSI C style and legal.  When no
args are specified or void is given, nothing is pushed on the stack
and no register hold arguments.

>   I even tried compiling with "-Wall" option to see if any warnings are
> being thrown by the compiler, but found to my disappointment that there
> was none.

Because there is nothing wrong with it.

>   Am I fundamentally going wrong in my understanding of functions?

No you're not.  You're just curious :-)

Regards

	\Steve

--

Steve Graegert <graegerts@gmail.com>
Software Consultancy {C/C++ && Java && .NET}
Mobile: +49 (176)  21248869
Office: +49 (9131) 7126409

  parent reply	other threads:[~2005-09-09  9:34 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-09 18:43 default function parameters _z33
2005-09-09  6:47 ` Steve Graegert
2005-09-09 19:38   ` _z33
2005-09-09  7:36     ` Steve Graegert
2005-09-09  8:46       ` _z33
2005-09-09  9:23         ` Jarmo
2005-09-09  9:42           ` Steve Graegert
2005-09-09  9:58             ` _z33
2005-09-09  9:50           ` _z33
2005-09-09  9:34         ` Steve Graegert [this message]
2005-09-09  9:44           ` _z33
2005-09-09 10:20             ` Steve Graegert
2005-09-09 13:00         ` Glynn Clements
2005-09-09 12:50     ` Glynn Clements
2005-09-09 12:43 ` Glynn Clements
2005-09-10  5:00   ` _z33

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6a00c8d505090902345d74646c@mail.gmail.com \
    --to=graegerts@gmail.com \
    --cc=linux-c-programming@vger.kernel.org \
    --cc=timid.Gentoo@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).