Contents|Index|Previous|Next
Nonstandard
predefined macros
The
C preprocessor normally has several predefined macros that vary between
machines because their purpose is to indicate what type of system and machine
is in use.
This
documentation, being for all systems and machines, cannot tell you exactly
what their names are. Instead, we offer a list of some typical ones.
You
can use cpp -dM
to see the values of predefined macros; for more information, see Invoking
the C preprocessor. Some nonstandard predefined
macros describe the operating system in use, with more or less specificity,
as in the following examples.
-
unix
unix
is normally predefined on all Unix systems.
-
BSD
BSD
is predefined on recent versions of Berkeley Unix (perhaps only in version
4.3).
Other
nonstandard predefined macros describe the kind of CPU, with more or less
specificity, as in the following six examples.
-
vax
vax
is predefined on Vax computers.
-
mc68000
mc68000
is predefined on most computers whose CPU is a Motorola 68000, 68010 or
68020.
-
m68k
m68k
is also predefined on most computers whose CPU is a 68000, 68010 or 68020;
however, some makers use mc68000
and some use m68k
as the names for the macros. Some predefine both names. What happens in
GNU C depends on the system you are using.
-
M68020
M68020
has been observed to be predefined on some systems that use 68020 CPUs—in
addition to mc68000 and m68k,
which are less specific.
-
_AM29K
-
_AM29000
Both _AM29K
and _AM29000
are predefined for the AMD 29000 CPU family.
-
ns32000
ns32000
is predefined on computers which use the National Semiconductor 32000 series
CPU.
Yet other
nonstandard predefined macros describe the manufacturer of the system,
as in the following three examples.
-
sun
sun
is predefined on all models of Sun computers.
-
pyr
pyr
is predefined on all models of Pyramid computers.
-
sequent
sequent
is predefined on all models of Sequent computers.
The previous
three predefined symbols are not only nonstandard, they are contrary to
the ANSI standard because their names do not start with underscores. Therefore,
the option, -ansi,
inhibits the definition of these symbols.
This
tends to make -ansi
useless, since many programs depend on the customary nonstandard predefined
symbols. Even system header files check them and will generate incorrect
declarations if they do not find the names that are expected. You might
think that the header files supplied for the Uglix computer would not need
to test what machine they are running on, because they can simply assume
it is the Uglix; but often they do, and they do so using the customary
names. As a result, very few C programs will compile with -ansi.
We intend to avoid such problems on the GNU system.
What,
then, should you do in an ANSI C program to test the type of machine it
will run on? GNU C offers a parallel series of symbols for this purpose,
whose names are made from the customary ones by adding ‘__’
at the beginning and end. Thus, the symbol, __vax__,
would be available on a Vax, and so on. The set of nonstandard predefined
names in the GNU C preprocessor is controlled (when cpp
is itself compiled) by the macro, CPP_PREDEFINES,
which should be a string containing -D
options, separated by spaces. For example, on the Sun 3, we use the following
definition.
#define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k"
This macro
is usually specified in tm.h.
Top|Contents|Index|Previous|Next