Skip to content
DevMeme
7109 of 7435
Our Blessed C26 Versus Their Barbarous C89
Languages Post #7794, on Mar 6, 2026 in TG

Our Blessed C26 Versus Their Barbarous C89

Why is this Languages meme funny?

Level 1: Two Villages Arguing About Forks

Picture two villages on opposite hills, waving flags and shouting insults across a river. One village eats with "noble gleaming forks," and they're disgusted that the other village eats with "barbarous pointy sticks." But if you look closely... a fork is just several pointy sticks glued together. That's the whole joke. Both groups of programmers use the same language, invented by the same people, to do the same things — one group just has newer words for it. The comic makes fun of how people turn tiny technical differences into holy wars, declaring everything ours glorious and everything theirs wicked, when a visitor from outside couldn't tell the two villages apart.

Level 2: A Field Guide to Both Kingdoms

The terms on the banners, decoded:

  • C89 — the first ANSI/ISO standard for C (1989), the dialect of K&R's second edition. Variables declared at the top of the block, /* comments only */, no booleans. Still the lowest common denominator for portable code.
  • C26 — the upcoming C standard, continuing what C23 started (which made true, false, and nullptr real keywords).
  • NULL vs nullptrNULL is a macro for a null pointer; because it can expand to plain 0, it sometimes behaves like an integer in surprising places. nullptr is a dedicated keyword with its own type, so the compiler can't confuse it with a number.
  • goto — jumps execution to a label. Infamous for producing "spaghetti code," but widely used in C for error-handling cleanup.
  • defer — schedules code (like free() or fclose()) to run automatically when the current scope exits, so cleanup can't be forgotten. Go and Zig programmers have had this for years.
  • void * — a pointer to "anything." Maximum flexibility, zero type safety: the compiler stops checking what you're pointing at.
  • _Generic — a C11 mechanism that picks different code depending on an argument's type, giving C a primitive form of overloading.

The early-career lesson: when you join a C codebase, the standard version in the build flags (-std=c89 vs -std=c2x) tells you which kingdom you've enlisted in, and you fight with that army's weapons.

Level 3: Thirty-Seven Years of Committee Warfare

The cartoon — drawn in the unmistakable Tom Gauld style of two fortified hills glaring at each other across a river, watchtowers and little sailboats included — maps the oldest joke in anthropology onto ISO standardization: our things are blessed, their identical things are barbarous. The left kingdom flies the banner "OUR BLESSED C26" with annotations reading "our glorious defer," "our great _Generic," "our noble true/false keyword," and "our heroic nullptr." Across the water, "THEIR BARBAROUS C89" fields "their wicked goto," "their primitive void *," "their backward 1/0," and "their brutish NULL."

The satirical payload is in the pairings, because each one is the same concept wearing different decades:

Blessed (C26) Barbarous (C89) Actual difference
nullptr NULL A real type (nullptr_t) vs. a macro that might be 0 or ((void*)0)
true/false keywords 1/0 First-class booleans vs. integers cosplaying as booleans
defer goto cleanup Structured scope-exit vs. the hand-rolled idiom every C codebase already uses
_Generic void * Compile-time type dispatch vs. "the type system is a suggestion"

The defer/goto pairing is the sharpest cut. Dijkstra's famous letter made goto the original programming heresy, yet the single most defensible use of goto ever found — jumping to a cleanup label to release resources, the pattern holding up the Linux kernel — is exactly what defer standardizes. The blessed feature is the barbarous feature with a helmet polished by WG14. That's the comic's quiet thesis: language standards don't conquer old idioms, they canonize them. And the river between the hills is doing real work too — it's the migration gap. Untold billions of lines of embedded firmware, banking systems, and vendor SDKs still compile as C89 because the toolchain for that one automotive microcontroller hasn't been updated since the compiler shipped on a CD. The C26 kingdom can wave its banners all it likes; the barbarians own most of the installed base, and both kingdoms ship identical undefined behavior the moment anyone dereferences past an array.

The deeper historical gag is that C has watched this war from both hills. In the 1990s, C was the barbarous kingdom in C++'s version of this cartoon. Every language lives long enough to become the legacy standard somebody draws a fortress around.

Description

A Tom Gauld-style cartoon of two fortified hills facing each other across a river, each with watchtowers, flags, and a small sailboat, parodying medieval tribal warfare with C language standards. The left side is labeled 'OUR BLESSED C26' with features annotated as 'our glorious defer', 'our great _Generic', 'our noble true/false keyword', and 'our heroic nullptr'. The right side is 'THEIR BARBAROUS C89' with 'their wicked goto', 'their primitive void *', 'their backward 1/0', and 'their brutish NULL'. The meme satirizes language-standard holy wars, framing modern C (C23/C26 features like defer and nullptr) as civilization and K&R-era C89 idioms as barbarism - while both camps remain, of course, the same language separated by 37 years of committee work

Comments

29
Anonymous ★ Top Pick Two kingdoms at war, yet both ship the same UB - the only thing C standards have deprecated successfully is each other's vocabulary
  1. Anonymous ★ Top Pick

    Two kingdoms at war, yet both ship the same UB - the only thing C standards have deprecated successfully is each other's vocabulary

  2. @mihanizzm 4mo

    They actually added boolean without linking a lib? Or is it just named int constants?

    1. @RiedleroD 4mo

      it's in stdlib

      1. @RiedleroD 4mo

        oh actually, looks like it's a keyword since C23: https://en.cppreference.com/w/c/keyword/bool.html

        1. @RiedleroD 4mo

          sorry, I'm more familiar with C99 than the ones after

          1. _ 4mo

            To be fair C99 seemed the last version ever for a long time. It seems the new features in C26 are mostly from one person pushing for C to be improved and legacy annoyances to be fixed

            1. @RiedleroD 4mo

              well … in my case I just don't really need anything beyond C99

              1. @imfreetodowhatever 4mo

                True

              2. _ 4mo

                Nothing of that is really needed, they're mostly ergonomic improvements, same as being able to declare iteration variables within for loops in C99

                1. @RiedleroD 4mo

                  with that line of reasoning you might as well be writing in plain asm. I meant none of the newer features are useful to me personally

  3. @imfreetodowhatever 4mo

    Whatever, pinch me when C++ modules are really supported

    1. @feedable 4mo

      hopefully never

      1. @Dark_Embrace 4mo

        Why not?

        1. @feedable 4mo

          modules are a disaster from compiler standpoint: there is a whole bunch of added complexity tied to intentionally forgetting parts of the compilation state to avoid conflicts, but that means they still behave essentially like TUs, so you don't actually get much perf benefit from using them anyway

          1. @feedable 4mo

            I imagine that for c it's a non-issue, but then even proliferation of this stuff is harmful

          2. @feedable 4mo

            pch always dealt with these issues properly, with the downside that there can only be one per TU, and it has to be at the very top, because that mechanism would actually dump the entire compilation state into the file, and then import that

          3. @death_by_oom 4mo

            And header files are such a joy to use? The solution to code reuse in c++/c is objectively ass and it's purely a reminder of its age and backwards compatibility.

            1. @feedable 4mo

              well, header files are better, yes, because they allow you to just get rid of TUs entirely

        2. @imfreetodowhatever 4mo

          I mean apart from ms

    2. @Dark_Embrace 4mo

      Pinging you. They are.

  4. @yuri_kilochek 4mo

    The main feature of C is universal support. New features are only supported on new compilers, so you might as well use any other modern language.

    1. @TheFloofyFloof 4mo

      is universal support even true when undefined behavior is relied upon by many apps?

      1. @yuri_kilochek 4mo

        those that do merely aren't using this feature

  5. @kapkekes 4mo

    and no one checked that _Generic isn’t actually a «generic» in the usual sense but rather a function overload for a finite number of types (defined by the user) it’s more like @singledispatch in Python

    1. @azizhakberdiev 4mo

      void* and there you go

      1. @feedable 4mo

        no!

    2. @sysoevyarik 4mo

      Imagine actually understand C before making jokes about it 🙄

  6. @Art3m_1502 4mo

    They finally have true/false keywords, the only thing I lacked in C

  7. @tema3210 4mo

    Defer in C???

Use J and K for navigation