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 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 Sun ISO C preprocessor doesn't recognize the Sun 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)=32
w[0].a=1,0,0
w[0].b=0
w[1].a=2,0,0
w[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__
|
|