|
|
|
envp argument to main() |
Allows envp as
third argument to main(). |
Allows this third argument; however, this usage is not
strictly conforming to the ISO C standard. |
Keywords |
Treats the identifiers const, volatile, and signed as
ordinary identifiers. |
const, volatile, and signed are keywords. |
extern and static functions declarations inside a block |
Promotes
these function declarations to file scope. |
The ISO standard does not guarantee that
block scope function declarations are promoted to file scope. |
Identifiers |
Allows dollar signs ($) in
identifiers. |
$ not allowed. |
long float types |
Accepts long float declarations and treats these as double(s). |
Does not accept
these declarations. |
Multi-character character-constants |
int mc = ’abcd’;yields: abcd |
int mc = ’abcd’;yields: dcba |
Integer constants |
Accepts 8 or 9 in octal escape sequences. |
Does not
accept 8 or 9 in octal escape sequences. |
Assignment operators |
Treats the following operator
pairs as two tokens, and as a consequence, permits white space between them: *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= |
Treats
them as single tokens, and therefore disallows white space in between. |
Unsigned preserving semantics
for expressions |
Supports unsigned preserving, that is, unsigned char/shorts are converted into unsigned int(s). |
Supports value-preserving, that
is, unsigned char/short(s) are converted into int(s). |
Single/double precision calculations |
Promotes the operands of floating
point expressions to double. Functions which are declared to return floats always promote their
return values to doubles. |
Allows operations on floats to be performed in single precision
calculations. Allows float return types for these functions. |
Name spaces of struct/union members |
Allows struct,
union, and arithmetic types using member selection operators (’.’, ’->’) to work on
members of other struct(s) or unions. |
Requires that every unique struct/union have its own
unique name space. |
A cast as an lvalue |
Supports casts of integral and pointer types
as lvalue(s). For example: (char *)ip = &char; |
Does not support this feature. |
Implied int declarations |
Supports declarations without an
explicit type specifier. A declaration such as num; is treated as implied int. For
example: num; /*num implied as an int*/ int num2; /* num2 explicitly*/ /* declared an int */ |
The num; declaration (without the explicit type specifier int) is not supported,
and generates a syntax error. |
Empty declarations |
Allows empty declarations, such as: int; |
Except for tags,
disallows empty declarations. |
Type specifiers on type definitions |
Allows type specifiers such as unsigned,
short, long on typedefs declarations. For example: typedef short small; unsigned small x; |
Does not allow type specifiers to
modify typedef declarations. |
Types allowed on bit fields |
Allows bit fields of all integral
types, including unnamed bit fields. The ABI requires support of unnamed bit fields
and the other integral types. |
Supports bit-fields only of the type int, unsigned int and
signed int. Other types are undefined. |
Treatment of tags in incomplete declarations |
Ignores the incomplete
type declaration. In the following example, f1 refers to the outer struct: struct x { . . . } s1; {struct x; struct y {struct x f1; } s2; struct x { . . . };} |
In
an ISO-conforming implementation, an incomplete struct or union type specifier hides an
enclosing declaration with the same tag. |
Mismatch on struct/union/enum declarations |
Allows a mismatch on the
struct/enum/union type of a tag in nested struct/union declarations. In the following example, the
second declaration is treated as a struct: struct x {. . . }s1; {union x s2;. . .} |
Treats
the inner declaration as a new declaration, hiding the outer tag. |
Labels in expressions |
Treats
labels as (void *) lvalues. |
Does not allow labels in expressions. |
switch condition type |
Allows float(s)
and double(s) by converting them to int(s). |
Evaluates only integral types (int, char, and enumerated) for
the switch condition type. |
Syntax of conditional inclusion directives |
The preprocessor ignores trailing tokens
after an #else or #endif directive. |
Disallows such constructs. |
Token-pasting and the ## preprocessor
operator |
Does not recognize the ## operator. Token-pasting is accomplished by placing a comment
between the two tokens being pasted: #define PASTE(A,B) A/*any comment*/B |
Defines ## as the preprocessor operator that
performs token-pasting, as shown in this example: #define PASTE(A,B) A##B Furthermore, the Solaris Studio ISO C preprocessor
doesn’t recognize the Solaris Studio C method. Instead, it treats the comment between
the two tokens as white space. |
Preprocessor rescanning |
The preprocessor recursively substitutes: #define F(X) X(arg) F(F) yields arg(arg) |
A macro is not
replaced if it is found in the replacement list during the rescan: #define F(X)X(arg)F(F) yields: F(arg) |
typedef names
in formal parameter lists |
You can use typedef names as formal parameter names in
a function declaration. “Hides” the typedef declaration. |
Disallows the use of an identifier
declared as a typedef name as a formal parameter. |
Implementation-specific initializations of aggregates |
Uses a
bottom-up algorithm when parsing and processing partially elided initializers within braces: struct{ int a[3]; int b; }\ w[]={{1},2}; yields sizeof(w)=16 w[0].a=1,0,0 w[0].b=2 |
Uses a
top-down parsing algorithm. For example: struct{int a[3];int b;}\ w[]={{1},2}; yields sizeof(w)=32w[0].a=1,0,0w[0].=0w[1].a=2,0,0w[1].b=0 |
Comments spanning include files |
Allows comments which start in
an #include file to be terminated by the file that includes the first
file. |
Comments are replaced by a white-space character in the translation phase of the
compilation, which occurs before the #include directive is processed. |
Formal parameter substitution within a
character constant |
Substitutes characters within a character constant when it matches the replacement list
macro: #define charize(c)’c’ charize(Z) yields: ’Z’ |
The character is not replaced: #define charize(c) ’c’charize(Z) yields: ’c’ |
Formal parameter substitution within a string constant |
The preprocessor
substitutes a formal parameter when enclosed within a string constant: #define stringize(str) ’str’ stringize(foo) yields: ”foo” |
The # preprocessor operator
should be used: #define stringize(str) ’str’ stringize(foo) yields: ”str” |
Preprocessor built into the compiler “front-end” |
Compiler invokes cpp(1) followed by
all the other components of the compilation system depending on the options specified. |
The
ISO C translation phases 1-4, which cover the processing of preprocessor directives, is
built directly into acomp, so cpp is not directly invoked during compilation, except
in -Xs mode. |
Line concatenation with backslash |
Does not recognize the backslash character in
this context. |
Requires that a newline character immediately preceded by a backslash character be
spliced together. |
Trigraphs in string literals |
Does not support this ISO C feature. |
|
asm keyword |
asm
is a keyword. |
asm is treated as an ordinary identifier. |
Linkage of identifiers |
Does not
treat uninitialized static declarations as tentative declarations. As a consequence, the second declaration
will generate a ’redeclaration’ error, as in: static int i = 1; static int i; |
Treats uninitialized static declarations as tentative declarations. |
Name spaces |
Distinguishes
only three: struct/union/enum tags, members of struct/union/enum, and everything else. |
Recognizes four distinct name
spaces: label names, tags (the names that follow the keywords struct, union or enum), members
of struct/union/enum, and ordinary identifiers. |
long double type |
Not supported. |
Allows long double type declaration. |
Floating point constants |
The
floating point suffixes, f, l, F, and L, are not supported. |
|
Unsuffixed integer
constants can have different types |
The integer constant suffixes u and U are not supported. |
|
Wide
character constants |
Does not accept the ISO C syntax for wide character constants,
as in: wchar_t wc = L’x’; |
Supports this syntax. |
’\a’ and ’\x’ |
Treats them as the characters ’a’ and
’x’. |
Treats ’\a’ and ’\x’ as special escape sequences. |
Concatenation of string literals |
Does not support
the ISO C concatenation of adjacent string literals. |
|
Wide character string literal syntax |
Does
not support the ISO C wide character, string literal syntax shown in this
example: wchar_t *ws = L"hello"; |
Supports this syntax. |
Pointers: void * versus char * |
Supports the ISO C void * feature. |
|
Unary plus
operator |
Does not support this ISO C feature. |
|
Function prototypes— ellipses |
Not supported. |
ISO C defines
the use of ellipses "..." to denote a variable argument parameter list. |
Type definitions |
Disallows
typedefs to be redeclared in an inner block by another declaration with the
same type name. |
Allows typedefs to be redeclared in an inner block by another
declaration with the same type name. |
Initialization of extern variables |
Does not support the
initialization of variables explicitly declared as extern. |
Treats the initialization of variables explicitly declared
as extern, as definitions. |
Initialization of aggregates |
Does not support the ISO C initialization
of unions or automatic structures. |
|
Prototypes |
Does not support this ISO C feature. |
|
Syntax of
preprocessing directive |
Recognizes only those directives with a # in the first column. |
ISO C
allows leading white-space characters before a # directive. |
The # preprocessor operator |
Does not
support the ISO C # preprocessor operator. |
|
#error directive |
Does not support this ISO
C feature. |
|
Preprocessor directives |
Supports two pragmas, unknown_control_flow and makes_regs_inconsistent along with the #ident
directive. The preprocessor issues warnings when it finds unrecognized pragmas. |
Does not specify its
behavior for unrecognized pragmas. |
Predefined macro names |
These ISO C-defined macro names are not
defined: __STDC__ __DATE__ __TIME__ __LINE__ |
|