Link error. /tmp/ccqpP1D1.o: In function `main': tst.c:(.text+0x15): undefined reference to `foo' collect2: ld returned 1 exit status
As Joseph said, I found the original text in c99 standard in section 6.7.4. " EXAMPLE The declaration of an inline function with external linkage can result in either an external definition, or a definition available for use only within the translation unit. A file scope declaration with extern creates an external definition. The following example shows an entire translation unit. inline double fahr(double t) { return (9.0 * t) / 5.0 + 32.0; } inline double cels(double t) { return (5.0 * (t - 32.0)) / 9.0; } extern double fahr(double); // creates an external definition double convert(int is_fahr, double temp) { /* A translator may perform inline substitutions */ return is_fahr ? cels(temp) : fahr(temp); } 8 Note that the definition of fahr is an external definition because fahr is also declared with extern, but the definition of cels is an inline definition. Because cels has external linkage and is referenced, an external definition has to appear in another translation unit (see 6.9); the inline definition and the external definition are distinct and either may be used for the call. " I understand now the GCC implementation conforms to c99, but don't see rationale behind it :-). Anyway, this is not gcc dev question any more. Cheers, Bingfeng > -----Original Message----- > From: Richard Guenther [mailto:richard.guent...@gmail.com] > Sent: 31 March 2009 15:32 > To: Bingfeng Mei > Cc: gcc@gcc.gnu.org > Subject: Re: gcc99 inlining rules > > On Tue, Mar 31, 2009 at 4:24 PM, Bingfeng Mei > <b...@broadcom.com> wrote: > > Hello, > > I found the following code doesn't compile with gcc4.4. and > -std=c99. Does this behaviour conform to standard? > > > > inline int foo(){ > > return 10; > > } > > > > int main(int argc, char **argv){ > > return foo(); > > } > > It works for me. What is your error? > > Richard. > >