United States |
Previous | Contents | Index |
In VAX C,
long float
is a synonym for
double
. Since the ANSI C Standard retires the
long float
specification, Compaq C in strict ANSI C mode diagnoses any use of
long float
as an error. The
long float
type is still accepted as a synonym for
double
in VAX C mode, but it elicits a warning diagnostic to the
effect that this is an obsolete usage.
A.1.13.3 Addition of the long double Type
On OpenVMS VAX systems, Compaq C maps the ANSI C defined long double type to the G_floating or D_floating format, depending on the /FLOAT (or /[NO]G_FLOAT) qualifier used. (VAX ONLY)
On OpenVMS Alpha systems, the long double type defaults to X_floating (/L_DOUBLE_SIZE=128). If /L_DOUBLE_SIZE=64 is specified, the long double type is mapped to G_floating, D_floating, or T-floating, depending on the /FLOAT (or /[NO]G_FLOAT) qualifier used. (ALPHA ONLY)
The
<float.h>
header file is modified to define the appropriate values to describe
the characteristics of this new data type.
A.1.13.4 Addition of Processor-Specific Integer Data Types
Compaq C for OpenVMS Systems supports the following processor-specific integer data types:
These data types are intended for applications that need integer data types of a specific size across platforms that support the data type.
The <ints.h> header file contains typedef s for the signed and unsigned variations of these integer data types. For increased portability, use these typedef s rather than using the built-in data types directly.
Note that the 64-bit integer types are available on OpenVMS Alpha systems but not on OpenVMS VAX systems.
The contents of <ints.h> are:
#ifndef __INTS_LOADED #define __INTS_LOADED 1 /**************************************************************************** ** ** <ints.h> - Definitions for platform specific integer types ** ***************************************************************************** ** Header is nonstandard ***************************************************************************** #pragma __nostandard /* ** Ensure that the compiler will not emit diagnostics about "signed" ** keyword usage when in /STAND=VAXC mode (the reason for the diagnostics ** is that VAX C does not support the signed keyword). */ #if ((__DECC_VER >= 50600000) && !defined(__DECCXX)) # pragma __message __save # pragma __message __disable (__SIGNEDKNOWN) typedef signed char int8; typedef unsigned char uint8; # pragma __message __restore #else typedef signed char int8; typedef unsigned char uint8; #endif /* ** Define 16 and 32 bit integer types */ #if defined(__DECC) || (defined(__DECCXX) && defined(__ALPHA)) typedef __int16 int16; typedef unsigned __int16 uint16; typedef __int32 int32; typedef unsigned __int32 uint32; #else typedef short int int16; typedef unsigned short int uint16; typedef int int32; typedef unsigned int uint32; #endif /* ** Define 64 bit integer types only on Alpha */ #ifdef __ALPHA typedef __int64 int64; typedef unsigned __int64 uint64; #endif #pragma __standard #endif /* __INTS_LOADED */ |
Compaq C for OpenVMS Systems in strict and relaxed ANSI C mode uses different rules than Compaq C in VAX C mode to determine if two types are identical:
These rules cause the strict and relaxed ANSI C modes to be much more
strict than VAX C mode about type checking.
A.1.15 Composite Types
As required by ANSI C, Compaq C merges type information from two declarations of the same object in the same scope. The declarations are required to be type-compatible and the linkage of the declarations must be such that multiple declarations in the same scope are allowed.
The composite type (the merged type) can be formed only from array or function types. Array types can have their array bounds specified, and function types can have their arguments specified.
For example, consider the following two declarations in the same scope:
extern int f(int (*)(), double (*)[3]); extern int f(int (*)(char *), double (*)[]); |
The resulting type for f is:
extern int f(int (*)(char *), double (*)[3]); |
The VAX C compiler did not support composite types, although it might have appeared to do so. For example, in VAX C, what appears to be a second declaration of a composite function type, is actually a redeclaration of the function. This might have an effect on the compilation. For example, if the first declaration has ellipses and the second declaration does not, a composite type cannot be formed (not allowed by the ANSI C Standard). However, a redeclaration is done.
Since the composite type feature of the ANSI C standard is important
even to those programming in VAX C mode, it is supported in
VAX C mode. Therefore, it is possible to encounter declaration
combinations that compile under VAX C but not under
Compaq C in VAX C mode.
A.1.16 Enumerations Have Type int
For type-checking purposes, VAX C previously considered
enumeration types to be distinct from each other, and from the integer
types, even though enumeration constants and variables have always been
usable as ordinary integers. Since the VAX C model of
enumerations was overly restrictive even from the strong typing point
of view, and since such checking is not common in modern C,
Compaq C does not treat enumerations as a special type.
A.1.17 long double Constants
As specified by ANSI C, Compaq C floating-point constants
suffixed by
l
or
L
have type
long double
. (Currently, VAX C gives such constants type
double
).
A.1.18 Implicit Unsigned Integer Constants
A.1.18.1 OpenVMS VAX Systems
The type of an unsuffixed decimal integer constant is the first type in the following list that can represent its value: int , long int , or unsigned long int . (VAX ONLY)
The type of an unsuffixed octal or hex constant is the first type in
the following list that can represent its value:
int
,
unsigned int
,
long int
, or
unsigned long int
. (VAX ONLY)
A.1.18.2 OpenVMS Alpha Systems
The type of an unsuffixed decimal integer constant is the first type in the following list that can represent its value: int , long int , unsigned long int (only in VAXC, COMMON, ANSI89, and MIA modes), long long int , unsigned long int . (ALPHA ONLY)
The type of an unsuffixed octal or hex constant is the first type in the following list that can represent its value: int , unsigned int , long int , unsigned long int , long long int , unsigned long long int . (ALPHA ONLY)
For more information, see the Integer Constants section in
Chapter 1 of the Compaq C Language Reference Manual.
A.1.19 Multibyte and Wide Character Support
To meet the needs of non-European languages with large character sets, ANSI C includes a framework to support characters encoded in multiple bytes. This framework is general enough to support character-processing extensions and character-set encodings already used in Asia, and allows for support for the draft proposed ISO Standard 10646, a multiple octet-coded character set that supports dozens of natural languages.
ANSI C supports natural languages with large character sets by recognizing that normal character constants and string literals can be used to represent multibyte characters. A multibyte character is an encoding of variable-length characters where one, two, or more bytes in the string represents a single character in the natural language. The encoding is allowed to support locking shift states that change the encoding of characters for as long as the shift state holds.
Multibyte characters can occur in comments, character constants, and string literals.
Because string manipulation is very difficult when the character size
varies from character to character, ANSI C supports a fixed-size
representation where each character is stored in the same number of
bytes. This representation is called wide character support.
Compaq C supports a new form of wide character constant and wide
string literal.
A.1.19.1 The Wide Character Type
ANSI C requires that wide characters be represented by an integral type, and that there be a typedef named wchar_t for that type in the header <stddef.h> .
Compaq C defines
wchar_t
to be
unsigned int
. This allows all character sets supported by ISO 10646 to be supported
simultaneously.
A.1.19.2 Multibyte Characters in Comments, Character Constants, and String Literals
Full multibyte support requires that the compiler be able to determine
whether an individual byte in a multibyte string is a single byte
character or part of a multiple byte character. For example, the
compiler must be able to distinguish between the single byte quote
ending a string literal and a quote that is embedded in a multiple byte
character and does not end the string literal.
A.1.19.3 Wide Character Constants
As required by ANSI C, Compaq C supports wide character constants. The form of such a constant is the uppercase letter L , followed by a single quote, followed by a multibyte character, followed by a single quote.
The compiler collects the bytes making up the multibyte character into
a string, and then calls the Compaq C RTL
mbtowc
function to convert the multibyte character into a wide character. The
resulting value has type
wchar_t
.
A.1.19.4 Wide String Literals
As required by the ANSI C Standard, Compaq C supports wide string literals. The form of such a literal is the same as a normal string literal prefixed by the uppercase letter L .
The compiler collects the bytes making up the wide string literal into
a string, and then calls the Compaq C RTL
mbstowcs
function to convert the multibyte characters into wide characters. The
resulting wide character string literal has type array of
wchar_t
.
A.1.20 Usual Arithmetic Conversions
In Compaq C, the usual arithmetic conversions now support the
long double
type: if either operand of a binary operator that uses these
conversions is
long double
, then the other operand is converted to
long double
.
A.1.21 Indexing as a Commutative Operator
As required by the ANSI C Standard, Compaq C now defines the
array indexing operator, [], as commutative. Thus, if
a
is an array and
i
is an integer, both
a[i]
and
i[a]
are valid.
A.1.22 Cast Operators
ANSI C specifies that result of the cast operator is not an lvalue. However, VAX C does allow the cast operator to produce an lvalue.
The Compaq C compiler in VAX C mode allows the cast
operator to produce an lvalue.
A.1.23 Function Calls
The following sections describe changes to function calls.
A.1.23.1 Assignment Compatibility Argument Checking
ANSI C defines a function call made with a prototype in scope as assigning the arguments to the parameters of the function. This means that all of the normal type checking and implied conversions that occur during an assignment take place when calling a function.
VAX C currently follows this model with two exceptions. First, it only performs the required type checking if /STANDARD=PORTABLE is given. Second, the assignment compatibility rules used by VAX C are not as stringent as the rules required by ANSI C. For example, two structs are assignment-compatible in VAX C only if they are the same size.
The Compaq C compiler in VAX C mode and common mode is
compatible with VAX C in assignment compatibility rules. Other
modes follow the stricter ANSI C rules, documented in Section A.1.27 of
this guide, and issue the required messages even when
/STANDARD=PORTABLE is not specified.
A.1.23.2 Passing Narrow Types to Old Syntax Functions
Traditionally, a function written in C was always called with widened argument types. (Arguments of narrow types like char , short , or float were passed as the widened types int , int , and double , respectively.) The ANSI C Standard preserves this calling mechanism for functions declared using the old syntax. Functions declared using the new prototype syntax may be called with narrow argument types.
Tradition, however, did not specify how the compiler was to interpret a function definition that declared formal arguments of narrow type. One interpretation was that the widened types actually passed should be converted to the narrow type of the formal declaration by the function in its prologue. Another interpretation was that the compiler should rewrite the formal declarations to match the type of the argument actually passed. For example, under this second interpretation, the compiler would change a declaration of a formal argument of type float to a declaration of type double .
ANSI C has standardized the first interpretation of a function with
formal arguments of narrow types. Compaq C for OpenVMS Systems uses the ANSI C
interpretation in all modes.
A.1.24 "Address of" Operator
In Compaq C, if the argument of the unary
&
operator is an array, the result now has the type "pointer to
array". Previously, in VAX C, the result would have the
type "pointer to the element type of the array".
A.1.25 Unary Plus
Compaq C supports the new ANSI C operator, unary plus (+). This
operator returns the value of its operand (possibly widened by the
integral promotions).
A.1.26 Relational Operators
As required by ANSI C, Compaq C issues a warning (in all modes except VAX C mode) to diagnose a constraint violation if one of the operands of a relational operator is a pointer to a function. For example, the following code would issue a warning:
int (*f)(); if (f > NULL) |
Note that it is valid to use the equality operators to compare function
pointers.
A.1.27 Assignment Compatibility
ANSI C has tighter assignment compatibility rules than those previously enforced by VAX C. (Note that assignment compatibility rules also control function argument passing.) Compaq C assignment compatibility differs from that of VAX C in the following ways:
Function prototype support, the new
const
and
volatile
type qualifiers, and the
void
type, were already implemented in VAX C. The following
sections describe the additional Compaq C support that affects
declarations. References are to the relevant sections in the ANSI C
Standard.
A.1.28.1 Implementation Limits
The ANSI C Standard requires that an implementation support certain
minimum requirements; these are listed in the referenced section. In
those cases where VAX C imposes a fixed limit, that limit has
always met or exceeded the Standard's requirements, and programs that
exceed any of these limits elicit the appropriate errors. In strict
ANSI C mode, Compaq C now issues diagnostics against any source
program constructs that exceed any of the Standard limits as well.
A.1.28.2 Identifier Name Length
In strict ANSI C mode, Compaq C now issues diagnostic messages
against declarations of external names in excess of six characters, or
external names that are intended to denote different objects but that
have the same spelling, and ignores alphabetical case.
A.1.28.3 Diagnosing Empty Declarations
The ANSI C Standard invalidates empty declarations, except for two
special cases: one involving structure/union tags and the other
involving the enumeration type. In strict ANSI C mode, Compaq C
issues an error message against any declaration that does not declare
at least one of the following: a declarator, a tag, or the members of
an enumeration.
A.1.28.4 Restriction on Placement of Storage-Class Specifiers
The ANSI C Standard specifies that allowing the placement of any
storage-class specifier other than at the beginning of a declaration is
an obsolete feature. In strict ANSI C mode, Compaq C now issues
an informational diagnostic to that effect when appropriate.
A.1.28.5 Diagnosing Old-Style Function Declarations
The ANSI C Standard specifies that old-style function declarations and
definitions (that is, those not using the function prototype format)
are obsolete. Old-style function declarations and definitions cause an
informational message to be issued in all modes except VAX C.
A.1.28.6 Function Definitions Using typedef-names
The ANSI C Standard restricts the form of the declarator in a function
definition: the function type itself may not be inherited from a
typedef
-name; that is, the declarator must explicitly contain a (possibly
empty) parenthesized parameter list. If not, Compaq C in strict
ANSI C mode issues an error message.
A.1.28.7 Initialization
Compaq C for OpenVMS Systems supports the initialization of unions.
In VAX C, an aggregate initializer consisting of a single item does not have to have the outer braces. The outer braces are required by the ANSI C Standard.
Compaq C allows this case in VAX C mode.
A.1.29 Bit-Field Initialization
The Compaq C compiler initializes bit-field structure members
differently than VAX C does. See Section 4.7.2.
A.1.30 The Preprocessor
The following sections describe the differences between the VAX C and the Compaq C preprocessors. Most of these differences reflect the Compaq C preprocessor's conformance to the ANSI C Standard. References are to the relevant sections in the ANSI C Standard.
Note that most VAX C-specific preprocessor extensions are unaffected by these changes. These extensions continue to be supported quietly in VAX C mode, but elicit appropriate diagnostics in strict ANSI C mode.
Previous | Next | Contents | Index |
|