Some calls cannot be integrated for
  various reasons (in particular, calls
  that precede the function's definition
  cannot be integrated, and neither can
  recursive calls within the
  definition). If there is a
  nonintegrated call, then the function
  is compiled to assembler code as
  usual. The function must also be
  compiled as usual if the program
  refers to its address, because that
  can't be inlined.
Note that certain usages in a function
  definition can make it unsuitable for
  inline substitution. Among these
  usages are: use of varargs, use of
  alloca, use of variable sized data
  types (see Variable Length), use of
  computed goto (see Labels as Values),
  use of nonlocal goto, and nested
  functions (see Nested Functions).
  Using -Winline will warn when a
  function marked inline could not be
  substituted, and will give the reason
  for the failure.
As required by ISO C++, GCC considers
  member functions defined within the
  body of a class to be marked inline
  even if they are not explicitly
  declared with the inline keyword. You
  can override this with
  -fno-default-inline; see Options Controlling C++ Dialect.
GCC does not inline any functions when
  not optimizing unless you specify the
  `always_inline' attribute for the
  function, like this:
 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline)); The remainder of this section is specific
to GNU C90 inlining.
When an inline function is not static,
  then the compiler must assume that
  there may be calls from other source
  files; since a global symbol can be
  defined only once in any program, the
  function must not be defined in the
  other source files, so the calls
  therein cannot be integrated.
  Therefore, a non-static inline
  function is always compiled on its own
  in the usual fashion.
If you specify both inline and extern
  in the function definition, then the
  definition is used only for inlining.
  In no case is the function compiled on
  its own, not even if you refer to its
  address explicitly. Such an address
  becomes an external reference, as if
  you had only declared the function,
  and had not defined it.
This combination of inline and extern
  has almost the effect of a macro. The
  way to use it is to put a function
  definition in a header file with these
  keywords, and put another copy of the
  definition (lacking inline and extern)
  in a library file. The definition in
  the header file will cause most calls
  to the function to be inlined. If any
  uses of the function remain, they will
  refer to the single copy in the
  library.