Path: utzoo!attcan!uunet!vsi!friedl From: friedl@vsi.COM (Stephen J. Friedl) Newsgroups: comp.lang.c Subject: Re: function prototype problem Summary: gotcha in ANSI C (read this) Message-ID: <937@vsi.COM> Date: 14 Nov 88 17:13:54 GMT References: <310@drd.UUCP> Followup-To: comp.std.c Distribution: na Organization: V-Systems, Inc. -- Santa Ana, CA Lines: 61 In article <310@drd.UUCP>, mark@drd.UUCP (Mark Lawrence) writes: > I compile the following code fragment: > > char *rpeet ( short, char ); /* just a declaration */ > > char *rpeet ( num, ch ) /* actual definition */ > short num; char ch; > { > /* foo */ > > and get the following gripe from my compiler (gcc 1.30): > > rpeet.c:9: argument `num' doesn't match function prototype > rpeet.c:9: argument `ch' doesn't match function prototype This is a gotcha that is not obvious -- it should be of general interest to all using a dpANS compiler. This compiler message is correct. In an old-style function declaration, the *actual* types of the arguments are those that would result from the default argument promotions (char-->int, short-->int, float-->double). So the above is the same as if the user had written: char *foo ( short, char ); vvv------------------- NOTE `int' char *foo ( num, ch ) int num, ch; { /* foo */ which is a mismatch. The solution is to either declare both args to be int everywhere or to use the prototype format for the function definition. The standard says [p 66, May88 dpANS]: 3.5.4.3. Function declarators (including prototypes): [....] If one [function declaration] type has a parameter-list type and the other type is specified by a function definition that contains a (possibly empty) identifier list, both shall agree in the number of parameters, and the type of each prototype parameter shall be compatible with the type that results from the application of the default argument promotions to the type of the corresponding identifier. ---- Followups to comp.std.c Steve, the stumbling lint (Hi Karl!) -- Steve Friedl V-Systems, Inc. +1 714 545 6442 3B2-kind-of-guy friedl@vsi.com {backbones}!vsi.com!friedl attmail!vsi!friedl ------------Nancy Reagan on the worm: "Just say OH NO!"------------