This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
gcc_extensions [2019/07/25 12:35] rpjday [Local labels] |
gcc_extensions [2019/07/25 12:52] rpjday [Nonlocal gotos] |
||
---|---|---|---|
Line 33: | Line 33: | ||
goto *ptr; | goto *ptr; | ||
</code> | </code> | ||
+ | |||
+ | ==== Nested functions ==== | ||
+ | |||
+ | <code> | ||
+ | foo (double a, double b) | ||
+ | { | ||
+ | double square (double z) { return z * z; } | ||
+ | |||
+ | return square (a) + square (b); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | See "trampolines." | ||
+ | |||
+ | ==== Nonlocal gotos ==== | ||
+ | |||
+ | Use ''%%__builtin_setjmp%%'' and ''%%__builtin_longjmp%%''. | ||
+ | |||
+ | ==== Constructing function calls ==== | ||
+ | |||
+ | ==== typeof ==== | ||
+ | |||
+ | <code> | ||
+ | #define max(a,b) \ | ||
+ | ({ typeof (a) _a = (a); \ | ||
+ | typeof (b) _b = (b); \ | ||
+ | _a > _b ? _a : _b; }) | ||
+ | </code> | ||
+ | |||
+ | ==== Conditionals ==== | ||
+ | |||
+ | Equivalent: | ||
+ | |||
+ | <code> | ||
+ | x ? x : y | ||
+ | x ? : y | ||
+ | </code> | ||
+ | |||
+ | ==== Non-constant initializers ==== | ||
+ | |||
+ | ==== Designated initializers ==== | ||
+ | |||
+ | ==== Case ranges ==== | ||
+ | |||
+ | <code> | ||
+ | case low ... high: | ||
+ | </code> | ||
+ | |||
+ | |||