The inline function specifier
An inline function is one for which the compiler copies
the code from the function definition directly into the code of the
calling function rather than creating a separate set of instructions
in memory. Instead of transferring control to and from the function
code segment, a modified copy of the function body may be substituted
directly for the function call. In this way, the performance overhead
of a function call is avoided. Using the inline
specifier
is only a suggestion to the compiler that an inline expansion can
be performed; the compiler is free to ignore the suggestion.
Any function, with the exception
of
main
, can be declared or defined as inline with
the inline
function specifier. Static local variables
are not allowed to be defined within the body of an inline function.
C++
functions implemented inside of a class declaration are automatically
defined inline. Regular C++ functions and member functions declared
outside of a class declaration, with the exception of
main
,
can be declared or defined as inline with the inline
function
specifier. Static locals and string literals defined within the body
of an inline function are treated as the same object across translation
units; see Linkage of inline functions for details.
inline int add(int i, int j) { return i + j; }
The
use of the inline
specifier does not change the meaning
of the function. However, the inline expansion of a function may not
preserve the order of evaluation of the actual arguments.The most efficient way to code an inline function is to place the inline function definition in a header file, and then include the header in any file containing a call to the function which you would like to inline.
inline
specifier
is represented by the following keywords: The
inline
keyword is recognized under compilation with xlc or c99, or with the -qlanglvl=stdc99 or -qlanglvl=extc99 options or -qkeyword=inline. The__inline__
(or__inline
) keyword is recognized at all language levels; however, see Linkage of inline functions below for the semantics of this keyword.The
inline
,__inline
, and__inline__
keywords are recognized at all language levels.
Linkage of inline functions

foo
is
defined in exactly the same way, foo
in file a.c
and foo
in
file b.c
are treated as separate functions: two function
bodies are generated, and assigned two different addresses in memory: // a.c
#include <stdio.h>
inline int foo(){
return 3;
}
void g() {
printf("foo called from g: return value = %d, address = %p\n", foo(), &foo);
}
// b.c
#include <stdio.h>
inline int foo(){
return 3;
}
void g();
int main() {
printf("foo called from main: return value = %d, address = %p\n", foo(), &foo);
g();
}
The output from the compiled program is: foo called from main: return value = 3, address = 0x10000580
foo called from g: return value = 3, address = 0x10000500
foo
from
function g
could return either 6 or 3: // a.c
#include <stdio.h>
inline int foo(){
return 6;
}
void g() {
printf("foo called from g: return value = %d\n", foo());
}
// b.c
#include <stdio.h>
int foo(){
return 3;
}
void g();
int main() {
printf("foo called from main: return value = %d\n", foo());
g();
}
Similarly, if you define a function as extern
inline
, or redeclare an inline
function
as extern
, the function simply becomes a regular,
external function and is not inlined. If you specify the
__inline__
keyword, with the trailing
underscores, the compiler uses the GNU C semantics for inline functions. In contrast to the C99
semantics, a function defined as __inline__
provides an external definition only; a
function defined as static __inline__
provides an inline definition with internal
linkage (as in C99); and a function defined as extern __inline__
, when compiled
with optimization enabled, allows the co-existence of an inline and external definition of the same
function. For more information on the GNU C implementation of inline functions, see the GCC
information, available at http://gcc.gnu.org/onlinedocs/.

You must define an inline function in exactly the same way in each translation unit in
which the function is used or called. Furthermore, if a function is defined as
inline
, but never used or called within the same translation unit, it is discarded
by the compiler (unless you compile with the -qkeepinlines option).
foo called from main: return value = 3, address = 0x10000580
foo called from g: return value = 3, address = 0x10000580
Redefining
an inline function with the same name but with a different function
body is illegal; however, the compiler does not flag this as an error,
but simply generates a function body for the version defined in the
first file entered on the compilation command line, and discards the
others. Therefore, the following example, in which inline function foo
is
defined differently in two different files, may not produce the expected
results: // a.C
#include <stdio.h>
inline int foo(){
return 6;
}
void g() {
printf("foo called from g: return value = %d, address = %p\n", foo(), &foo);
}
// b.C
#include <stdio.h>
inline int foo(){
return 3;
}
void g();
int main() {
printf("foo called from main: return value = %d, address = %p\n", foo(), &foo);
g();
}
When compiled with the command xlc++ a.C
b.C
, the output is: foo called from main: return value = 6, address = 0x10001640
foo called from g: return value = 6, address = 0x10001640
The
call to foo
from main
does not use
the inline definition provided in b.C
, but rather
calls foo
as a regular external function defined
in a.C
. It is your responsibility to ensure that
inline function definitions with the same name match exactly across
translation units, to avoid unexpected results.// a.C
#include <stdio.h>
inline int foo(){
static int x = 23;
printf("address of x = %p\n", &x);
x++;
return x;
}
void g() {
printf("foo called from g: return value = %d\n", foo());
}
// b.C
#include <stdio.h>
inline int foo()
{
static int x=23;
printf("address of x = %p\n", &x);
x++;
return x;
}
void g();
int main() {
printf("foo called from main: return value = %d\n", foo());
g();
}
The output of this program shows that x
in
both definitions of foo
is indeed the same object: address of x = 0x10011d5c
foo called from main: return value = 24
address of x = 0x10011d5c
foo called from g: return value = 25
If you want to ensure that each instance of function defined as inline is treated
as a separate function, you can use the static
specifier in the function definition
in each translation unit, or compile with the -qstaticinline option. Note, however, that
static inline functions are removed from name lookup during template instantiation, and are not
found.