gcc with plan9-extensions

Posted on Tue Jan 10, 2017

I have been compiling code with the gnu C language compiler (gcc) since I started using gnu+Linux back in 1997 (more or less). But I very rarely read its documentation, especially the C language extensions that it implements.

Lately, while learning a bit about support for the C11 standard, I have discovered that gcc implements unnamed fields in structures, with some extensions, through the -fplan9-extensions option. I find these amazing. From a certain point of view, these extensions are just the default offered by the C++ language; but under the C language they are amazing.

Here is an example:

/* demo.c --
 *
 * Compile this with:
 *
 *  $ gcc -std=c11 -Wall -fplan9-extensions -o demo demo.c
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  int   one;
} alpha_t;

typedef struct {
  alpha_t;
  int           two;
} beta_t;

void
print_alpha (alpha_t * self)
{
  fprintf(stderr, "alpha: %d\n", self->one);
}
void
print_beta (beta_t * self)
{
  fprintf(stderr, "beta: %d %d\n", self->one, self->two);
}

int
main (int argc, const char *const argv[])
{
  beta_t        B = { .one = 1, .two = 2 };
  print_alpha(&B);
  print_beta (&B);
  exit(EXIT_SUCCESS);
}

/* end of file */

we see that the definition of beta_t contains an unnamed field of type alpha_t:

typedef struct {
  alpha_t;
  int           two;
} beta_t;

and we can access its fields, nested in an instance of beta_t, transparently both in the initialiser:

beta_t B = { .one = 1, .two = 2 };

and from a pointer to beta_t in the function print_beta():

fprintf(stderr, "beta: %d %d\n", self->one, self->two);

Also, when a pointer to beta_t is used as operand for a function expecting a pointer to alpha_t as argument: the pointer conversion is performed automatically by the compiler, without the need to cast it explicitly. So we can simply write:

print_alpha(&B);

rather than:

print_alpha((alpha_t *)&B);

I have decided to try these features in my recent CCExceptions project.