Skip to content
Tech News
← Back to articles

C++26: A User-Friednly assert() macro

read original get C Programming Assertion Kit → more articles
Why This Matters

C++26 introduces a more user-friendly assert() macro to address longstanding issues with the traditional macro's syntax and usability. These improvements aim to make assertions clearer and less error-prone, especially for modern C++ features like templates and initializer lists. This change enhances developer productivity and reduces common pitfalls, benefiting both the industry and individual programmers.

Key Takeaways

C++26 is bringing some long-overdue changes to assert() . But why are those changes needed? And when do we actually use assert , anyway?

At its core, assert() exists to validate runtime conditions. If the given expression evaluates to false , the program aborts. I’m almost certain you’ve used it before — at work, in personal projects, or at the very least in examples and code snippets.

So what’s the problem?

The macro nobody treats like a macro

assert() is a macro — and a slightly sneaky one at that. Its name is written in lowercase, so it doesn’t follow the usual SCREAMING_SNAKE_CASE convention we associate with macros. There’s a good chance you’ve been using it for years without ever thinking about its macro nature.

Macros, of course, aren’t particularly popular among modern C++ developers. But the issue here isn’t the usual - but valid - “macros are evil” argument. The real problem is more specific:

The preprocessor only understands parentheses for grouping. It does not understand other C++ syntax such as template angle brackets or brace-initialization.

As a result, several otherwise perfectly valid-looking assertions fail to compile:

1 2 3 4 5 6 7 // https://godbolt.org/z/9sqM7PvWh using Int = int ; int x = 1 , y = 2 ; assert ( std :: is_same < int , Int >:: value ); assert ([ x , y ]() { return x < y ; }() == 1 ); assert ( std :: vector < int > { 1 , 2 , 3 }. size () == 3 );

Each of these breaks for essentially the same reason: the macro argument parsing gets confused by commas or braces that aren’t wrapped in an extra pair of parentheses.

... continue reading