1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# Extensions
In addition to C11, several [GNU extensions] are implemented and more
may be implemented in the future.
## Implemented
### `__typeof__`
`__typeof__(E)` is a type specifier for the type of expression `E`. Arrays
and function designator expressions do not decay into pointers, just
like when used with `sizeof`.
### `__asm__` labels
A declarator can be followed by `__asm__("somelabel")` to specify the
assembler name of the object or function. This name is taken literally, so
the resulting symbol will not be mangled according to the target's usual
rules. The name may contain characters not allowed in regular identifiers.
### Built-in functions and types
- **`__builtin_alloca`**: Allocate memory on the stack.
- **`__builtin_constant_p`**: Test whether the argument is a constant expression.
- **`__builtin_inff`**: `float` positive infinity value.
- **`__builtin_nanf`**: `float` quiet NaN value.
- **[`__builtin_offsetof`]**: Return the offset of a member in a struct or union.
- **`__builtin_types_compatible_p`**: Test whether the two types are compatible.
- **`__builtin_va_arg`**: Built-in suitable for implementing the `va_arg` macro.
- **`__builtin_va_copy`**: Built-in suitible for implementing the `va_copy` macro.
- **`__builtin_va_end`**: Built-in suitible for implementing the `va_end` macro.
- **`__builtin_va_list`**: Built-in suitable for implementing the `va_list` type.
- **`__builtin_va_start`**: Built-in suitable for implementing the `va_start` macro.
### Enumerator values outside the range of `int`
ISO C requires that enumerator values be in the range of `int`. GNU C
allows any integer value, at the cost of enumerator constants possibly
having different types inside and outside the `enum` specifier.
In the following example, `A` has type `unsigned` inside the `enum`
specifier, and `long` outside, so both of the assertions fail.
```c
enum E {
A = 0x80000000,
B = sizeof(A),
C = A < -1,
D = -1,
};
_Static_assert(B == sizeof(A), "sizeof(A) changed");
_Static_assert(C == A < -1, "signedness of typeof(A) changed");
```
As a compromise, we allow enumerator values larger than `INT_MAX` and
less than or equal to `UINT_MAX`, but only if no other enumerators have
a negative value. This way, enumerator constants have a fixed type.
## Missing
### Statement expressions
In GNU C, you may use a compound statement as expressions when they are
enclosed in parentheses. The last statement in the compound statement
must be an expression statement, whose value is used as the result of
the statement expression.
### Empty declarations
GNU C allows empty top-level declarations (i.e. `;`).
### Empty initializer list
GNU C allows empty initializer lists when initializing an object,
for example
```c
struct {
int a, b;
} s = {};
```
This behaves exactly the same as `{0}`.
### Missing operand in conditional expression
GNU C allows you to omit the second operand in conditional expressions,
in which case the first operand is used. So `E1 ? : E2` behaves the same
as `E1 ? E1 : E2`, except that `E1` is evaluated only once.
[GNU extensions]: https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
[`__builtin_offsetof`]: https://gcc.gnu.org/onlinedocs/gcc/Offsetof.html
|