Anonymous ("transparent") structures are a good thing in programming languages

August 2, 2021

I recently wrote about learning how C unions can be used to create optional namespaces, by creative use of both anonymous unions and anonymous structs. However, the problem in that entry is not that modern C has anonymous unions and structs (officially added in C11, a GNU extension before then, and before that a Plan 9 one). I think that what we could call "transparent" structures are a good thing in any language, not just C (Go has them too, and probably other languages as well).

Let's start with a traditional C sub-struct:

struct common {
  int field1;
  void *field2;
struct fred {
  struct common sub;

The sub struct is two things in one; it's both a namespace (fred.sub) and a collection of reusable field definitions. However, there's no particular reason why these thing should always have to go together, so that you're forced to create a new namespace (and exile things into it) any time you want a collection of common fields. Back when traditional C gave you no choice, people built various hacks to get common fields without the namespaces (for example, a #define that defined all of your common fields together). In Go, where this has been legal since the beginning, I believe that this "embedding" is reasonably popular, showing that there is real demand (and use) for it.

(In C11, anonymous structs and unions must be completely anonymous, without a name for the new struct or union type, but in other C dialects and other languages you can be more flexible. See the GCC documentation on Unnamed Structure and Union Fields. I'm using the term "transparent" to cover all cases where the sub-structure has no overall name and the names of its fields are directly usable, as if they were top-level fields.)

It doesn't make much sense to have namespaces without something in them, but as we've seen there's a desire to not always have to use the name of the namespace to refer to things inside it. I don't know if anyone has come up with a good syntax for this (in any language).

PS: Go officially supports fairly liberal struct embedding, but in practice its full generality is rarely used.

Written on 02 August 2021.
« Unix APIs are where I first saw C #define used to rename struct fields
When you do and don't get stuck query results from a down Prometheus »

Page tools: View Source, Add Comment.
Login: Password:
Atom Syndication: Recent Comments.

Last modified: Mon Aug 2 22:18:02 2021
This dinky wiki is brought to you by the Insane Hackers Guild, Python sub-branch.