C : Specification, Extensions, Subsets, Support
See
C99
- Specification of C99: SPEC
Gnu Extensions
GNU extensions are documented in the gcc C parser and at http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html.
Here is a summary of available extensions:
C99 6.5: Expressions
| Statement-Exprs | Compound Statement as Expressions |
| #define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) | |
| Labels-as-Values | Taking the address of a label (see `Computed goto') |
| Typeof | compute type of expression |
| int x = 2; typeof(x) y = 3; | |
| Conditionals | Omitting the middle operand of a `?:' expression |
| x ? : y is equivalent to x ? x : y | |
| Alignment | Compute the alignment of an object |
| __alignof__ (double) | |
| Offsetof | Compute offfset of member |
| Other builtins | Various builtin functions of gcc |
| __builtin_types_compatible_p is supported | |
| Complex numbers | GNU complex extensions |
| __complex double c = 2 + 3i, d = __real a; | |
| Character-Escapes | \e for ESC |
| char c = '\e' ; | |
| __builtin_va_arg | __builtin_va_arg |
C99 6.7: Declarations
| Empty-Structures | Allow empty structures |
| Incomplete-Enums | Allow incomplete enum definitions |
| Initializers | Allow non-constant initializers |
| Extended Asm | Assembler instructions with C expressions as operands |
| function attributes | Attributes annotating function declarations |
| variable attributes | Attributes annotating variable declarations |
| type attributes | Attributes annotating type declarations (struct, union) |
| Thread-Local | Thread-local storage |
C99 6.8: Statements
| Local-Labels | Labels local to a block (affects: C99 6.8.2) | ||
| do{ __label __ back; goto back; back: ...; }while(0); | |||
| Labels-as-Values | Computed Gotos (affects: C99 6.8.6) | ||
| void* p = && back; ... ; goto *p; | |||
| Asm-Labels | Controlling Names Used in Assembler Code | ||
| Nested-Functions | nested functions | ||
| int a() { int b() { return 0;} return b(); } | |||
| Case-Ranges | case ranges (affects: C99 6.8.1) | ||
| case 'A' ... 'Z': |
C99 6.9 :Translation unit
| Empty Translation unit | allow empty translation_unit |
| Redundant ; | allow redundant ';' |
| Alternate Keywords | allow __extension__ keyword before external declaration, and alternate keywards __asm__, __inline__, etc. |
| Extended-Asm | Top level asm definitions |
Extensions which do not apply
For completeness sake, the extensions Object Size Checking, Constructing-Calls, Zero-Length Arrays, Pointer-Arith, Cast-to-Union and Function-Prototypes listed on http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html do not affect the syntax of the program, and can therefore be considered as `supported'.
Some other extensions simply promote C99 features to C89 and therefore aren't listed here.
Variadic-Macros, Escaped-Newlines, C++-Comments apply to the preprocessor only.
Unsupported C99 Features
- Universal Character Names (C99 Lexer)
Currently Unsupported GNU Extensions
| Pragmas | #pragma compile directives |
| #pragma pack(push, p1, 1) | |
| Floating-Types | Additional Floating Types |
| __float80 x = 2.30w; | |
| Decimal-Float | Decimal Floating Types |
| __Decimal32 x = 0.555df; | |
| Fixed_002dPoint | Fixed-Point Types |
| _Sat long long _Fract pi = 3.14LLR | |
| Dollar-Signs | Dollar sign is allowed in identifier names |
| int $x = 3; | |
| Binary-constants | Binary constants |
| int x = 0b001; |
Unsupported non-standard C constructs (which GCC allows)
useless qualifiers/type names/storage specs in empty declarations
int;
const;
static;
void f(a,b) int; register; { } /* Empty declarations in old-style parameter declarations aren't supported either. */
obsolete use of designated initializer without ‘=’
int e[] = { [2] 2 };
data definition without type or storage class
a; /* top-level declaration */ b();
GNU parameter forward declaration
int f1(int a; int a);
no semicolon at end of struct or union
struct s3 {
int d
};
