Language Implementation
7-51
7
It is up to you to make sure that the assembler names you choose do not
conflict with any other assembler symbols. Also, you must not use a
register name; that would produce completely invalid assembler code.
Specifying Registers for Local Variables
You can define a local register variable with a specified register like this:
register int *foo asm ("r5");
r5
is the name of the register that should be used.
Defining such a register variable does not reserve the register; it remains
available for other uses in places where flow control determines the
variable's value is not live. However, excessive use of this feature may
leave the compiler too few available registers to compile certain functions.
Alternate Keywords
The option traditional disables certain keywords; ansi disables certain
others. This causes trouble when you want to use GNU C extensions, or
ANSI C features, in a general-purpose header file that should be usable by
all programs, including ANSI C programs and traditional ones. The
keywords
asm, typeof and inline cannot be used since they won’t work
in a program compiled with
ansi, while the keywords const, volatile,
signed, typeof and inline won’t work in a program compiled with
traditional.
The way to solve these problems is to put
__ at the beginning and end of
each problematical keyword. For example, use
__asm__ instead of asm,
__const__ instead of const, and __inline__ instead of inline.
Other C compilers won’t accept these alternative keywords; if you want to
compile with another compiler, you can define the alternate keywords as
macros to replace them with the customary keywords. It looks like this:
#ifndef __GNUC__
#define __asm__ asm
#endif