| | |
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.
| 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.
| Supports value-preserving, that is, unsigned char/short(s) are converted into int.
|
Single/double precision calculations
| Promotes the operands of floating-point expressions to double. Functions that 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 structs 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 lvalues.
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, for example: 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 floats and doubles by converting
them to ints.
| 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, for example: #define PASTE(A,B) A##B Furthermore, the preprocessor does not recognize the 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 that 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__
|
|