#pragma interface
and #pragma implementation
provide the
user with a way of explicitly directing the compiler to emit entities
with vague linkage (and debugging information) in a particular
translation unit.
Note: As of GCC 2.7.2, these #pragma
s are not useful in
most cases, because of COMDAT support and the “key method” heuristic
mentioned in Vague Linkage. Using them can actually cause your
program to grow due to unnecessary out-of-line copies of inline
functions. Currently (3.4) the only benefit of these
#pragma
s is reduced duplication of debugging information, and
that should be addressed soon on DWARF 2 targets with the use of
COMDAT groups.
#pragma interface
#pragma interface "
subdir/
objects.h"
The second form of this directive is useful for the case where you have
multiple headers with the same name in different directories. If you
use this form, you must specify the same string to ‘#pragma
implementation’.
#pragma implementation
#pragma implementation "
objects.h"
If you use ‘#pragma implementation’ with no argument, it applies to an include file with the same basename1 as your source file. For example, in allclass.cc, giving just ‘#pragma implementation’ by itself is equivalent to ‘#pragma implementation "allclass.h"’.
In versions of GNU C++ prior to 2.6.0 allclass.h was treated as an implementation file whenever you would include it from allclass.cc even if you never specified ‘#pragma implementation’. This was deemed to be more trouble than it was worth, however, and disabled.
Use the string argument if you want a single implementation file to include code from multiple header files. (You must also use ‘#include’ to include the header file; ‘#pragma implementation’ only specifies how to use the file—it doesn't actually include it.)
There is no way to split up the contents of a single header file into multiple implementation files.
‘#pragma implementation’ and ‘#pragma interface’ also have an effect on function inlining.
If you define a class in a header file marked with ‘#pragma
interface’, the effect on an inline function defined in that class is
similar to an explicit extern
declaration—the compiler emits
no code at all to define an independent version of the function. Its
definition is used only for inlining with its callers.
Conversely, when you include the same header file in a main source file that declares it as ‘#pragma implementation’, the compiler emits code for the function itself; this defines a version of the function that can be found via pointers (or by callers compiled without inlining). If all calls to the function can be inlined, you can avoid emitting the function by compiling with -fno-implement-inlines. If any calls are not inlined, you will get linker errors.
[1] A file's basename is the name stripped of all leading path information and of trailing suffixes, such as ‘.h’ or ‘.C’ or ‘.cc’.