User Tools

Site Tools


gcc_extensions

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.

gcc_extensions.txt · Last modified: 2019/07/25 12:53 by rpjday