C/C++ Programmer's Guide (G06.27+, H06.08+, J06.03+)

G.3.8 Registers
The register storage class specifier cannot be used with structure or array declarations. A
register variable may be changed to a nonregister type or a nonregister type changed to register
by the optimizer.
G.3.9 Structures, Unions, Enumerations, and Bit Fields
A union is considered as a block of memory the size of the union. If a member of a union has a
value stored in it and is subsequently accessed using a member of a different type the result is
defined as the value of the accessed type at that block of memory. If the size of the type stored is
smaller than the accessed type and the accessed value is beyond the stored type, the result is
undefined. If the type stored is a structure with holes, and the accessed value overlaps any of the
holes, the value is undefined.
Each member of a structure is aligned on the boundary required by its type. Padding is added
between members as necessary.
A plain int bit field is a signed int bit field.
Bits within an integer bit field are allocated most significant bit first.
A bit field cannot straddle a word boundary. If the bit field is a member of a structure with alignment
SHARED2, and the size of the bit field is no greater than 16 bits, it is further restricted not to straddle
a half word boundary.
The values of an enumeration declaration are type int.
G.3.10 Qualifiers
Each time a value is needed from a volatile object, a read access is made to it. Each time the value
needs to be written, a write access is made. This rule ensures that volatile objects are accessed in
the same way as in the abstract semantics. However, there is one exception: when a volatile bit
field is written to, hardware constraints may force a read to occur before the write, to read the
parts of the storage unit that are not changed in the write. Volatile bit fields should be used with
caution.
G.3.11 Declarators
An arithmetic, structure, or union type can have 12 declarators modifying it. The maximum number
of declarators allowed is limited only by the amount of available memory at compilation time.
G.3.12 Statements
The maximum number of case values allowed in a switch statement is limited only by the amount
of available memory at compilation time.
G.3.13 Preprocessing Directives
The value of a single-character character constant in a constant expression that controls conditional
inclusion matches the value of the same character constant in the execution character set. A
single-character character constant is an unsigned character and therefore cannot be negative.
When the include file is specified as "filename":
If the compiler is running in the Guardian environment, the current subvolume is searched first
If the compiler is running in the OSS environment, the current directory is searched first
When an include file is specified as <filename>:
If the compiler is running in the Guardian environment, the only subvolume searched is the
compiler’s subvolume (usually, $system.system)
If the compiler is running in the OSS environment, the only directory searched is
/usr/include.
The SSV pragma can be used to modify the subvolume searched when running under Guardian,
and the -I option can be used to modify the search directories when running under OSS.
398 HP C Implementation-Defined Behavior