===== Overview =====
Most useful GCC extensions to C language; avoid by using ''-pedantic''.
===== Extensions =====
==== Statements and declarations in expressions ====
A compound statement enclosed in parentheses may appear as an expression in GNU C. This allows you to use loops, switches, and local variables within an expression.
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
==== Local labels ====
GCC allows you to declare local labels in any nested block scope. A local label is just like an ordinary label, but you can only reference it (with a goto statement, or by taking its address) within the block in which it is declared.
__label__ label;
==== Labels as values ====
You can get the address of a label defined in the current function (or a containing function) with the unary operator ‘&&’. The value has type void *. This value is a constant and can be used wherever a constant of that type is valid.
void *ptr;
/* … */
ptr = &&foo;
...
goto *ptr;
==== Nested functions ====
foo (double a, double b)
{
double square (double z) { return z * z; }
return square (a) + square (b);
}
See "trampolines."
==== Nonlocal gotos ====
Use ''%%__builtin_setjmp%%'' and ''%%__builtin_longjmp%%''.
==== Constructing function calls ====
==== typeof ====
#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
==== Conditionals ====
Equivalent:
x ? x : y
x ? : y
==== Non-constant initializers ====
==== Designated initializers ====
==== Case ranges ====
case low ... high:
Don't forget spaces.