This behavior seems to be specfic to newer versions of Clang, and is a language extension called "blocks".

The Wikipedia article on C "blocks" also provides information which supports this claim:

Blocks are a non-standard extension added by Apple Inc. to Clang's implementations of the C, C++, and Objective-C programming languages that uses a lambda expression-like syntax to create closures within these languages. Blocks are supported for programs developed for Mac OS X 10.6+ and iOS 4.0+, although third-party runtimes allow use on Mac OS X 10.5 and iOS 2.2+ and non-Apple systems.

Emphasis above is mine. On Clang's language extension page, under the "Block type" section, it gives a brief overview of what the Block type is:

Like function types, the Block type is a pair consisting of a result value type and a list of parameter types very similar to a function type. Blocks are intended to be used much like functions with the key distinction being that in addition to executable code they also contain various variable bindings to automatic (stack) or managed (heap) memory.

GCC also has something similar to blocks called lexically scoped nested functions. However, there are some key differences also note in the Wikipedia articles on C blocks:

Blocks bear a superficial resemblance to GCC's extension of C to support lexically scoped nested functions. However, GCC's nested functions, unlike blocks, must not be called after the containing scope has exited, as that would result in undefined behavior.

GCC-style nested functions also require dynamic creation of executable thunks when taking the address of the nested function. [...].

Emphasis above is mine.

Answer from Chris on Stack Overflow
🌐
GeeksforGeeks
geeksforgeeks.org › c++ › lambda-expression-in-c
Lambda Expression in C++ - GeeksforGeeks
Used in Callbacks and Event Handling for asynchronous tasks and events. ... #include <iostream> using namespace std; int main() { // Defining a lambda auto res = [](int x) { return x + x; }; // Using the lambda cout << res(5); return 0; }
Published   April 26, 2026
Top answer
1 of 2
10

This behavior seems to be specfic to newer versions of Clang, and is a language extension called "blocks".

The Wikipedia article on C "blocks" also provides information which supports this claim:

Blocks are a non-standard extension added by Apple Inc. to Clang's implementations of the C, C++, and Objective-C programming languages that uses a lambda expression-like syntax to create closures within these languages. Blocks are supported for programs developed for Mac OS X 10.6+ and iOS 4.0+, although third-party runtimes allow use on Mac OS X 10.5 and iOS 2.2+ and non-Apple systems.

Emphasis above is mine. On Clang's language extension page, under the "Block type" section, it gives a brief overview of what the Block type is:

Like function types, the Block type is a pair consisting of a result value type and a list of parameter types very similar to a function type. Blocks are intended to be used much like functions with the key distinction being that in addition to executable code they also contain various variable bindings to automatic (stack) or managed (heap) memory.

GCC also has something similar to blocks called lexically scoped nested functions. However, there are some key differences also note in the Wikipedia articles on C blocks:

Blocks bear a superficial resemblance to GCC's extension of C to support lexically scoped nested functions. However, GCC's nested functions, unlike blocks, must not be called after the containing scope has exited, as that would result in undefined behavior.

GCC-style nested functions also require dynamic creation of executable thunks when taking the address of the nested function. [...].

Emphasis above is mine.

2 of 2
7

the C standard does not define lambdas at all but the implementations can add extensions.

Gcc also added an extension in order for the programming languages that support lambdas with static scope to be able to convert them easily toward C and compile closures directly.

Here is an example of extension of gcc that implements closures.

#include <stdio.h>

int(*mk_counter(int x))(void)
{
    int inside(void) {
        return ++x;
    }
    return inside;
}

int
main() {
    int (*counter)(void)=mk_counter(1);
    int x;
    x=counter();
    x=counter();
    x=counter();
    printf("%d\n", x);
    return 0;
}
Discussions

simple lambda like functions in C
These nested functions aren’t standard C and they won’t work on Clang or MSVC. More on reddit.com
🌐 r/C_Programming
26
11
March 12, 2024
I still don't understand the benefit of lambda functions
they're just...functions with different syntax That's exactly what they are. The main syntactical difference between the two is that a regular function definition is a statement, whereas a lambda function definition is an expression. Lambda functions can therefore be defined and then passed to another function in one step, without having to go through a local name (that's also why lambda functions are sometimes called anonymous functions, they don't necessarily have a particular name). Lambda is a convenience feature to more easily define small, one-off functions. More on reddit.com
🌐 r/learnpython
118
324
January 23, 2022
C++ now supported in AWS lambda

Uhhm, you could always use C++ on AWS Lambda.

It's nice to have a C++ runtime available, makes things easier, but nothing prevented you running native code on Lambda.

More on reddit.com
🌐 r/cpp
42
141
November 29, 2018
Func(Event) to a lambda expression in C++
UObject delegates basically bind to the function names of given UObject, triggering it later. Such bindings are actually a wrapper for BindUFunction() expecting a string (which is obviously an unsafe thing to use directly in our code). Methods defined outside of C++ (like blueprint ones) don't exist during C++ compilation, blueprint delegates are bound "dynamically", found by name ;) We can only bind methods to delegates directly if the method signature matches the delegate signature. Other cases are rare, input bindings are actually one of the common cases where lambda is needed :) I haven't used it myself and can't fully test it right now, but it goes like this. FInputActionBinding MyActionBinding("MyAction", IE_Released); MyActionBinding.ActionDelegate.GetDelegateForManualSet().BindWeakLambda(this, [this]() { MyCustomMethod(MyParam); }); More on reddit.com
🌐 r/unrealengine
2
1
June 17, 2020
🌐
Hackaday
hackaday.com › 2019 › 09 › 11 › lambdas-for-c-sort-of
Lambdas For C — Sort Of | Hackaday
November 2, 2023 - If you use another compiler, it might not — in fact, probably doesn’t — have these features. In the end, though, you could always just use a proper function with a pointer. This is a bit nicer. I created a simple example of a case where you might want to use a lambda in C.
🌐
Cprogramming.com
cprogramming.com › c++11 › c++11-lambda-closures.html
C++11 - Lambda Closures, the Definitive Guide - Cprogramming.com
How to begin Get the book · C tutorial C++ tutorial Game programming Graphics programming Algorithms More tutorials
🌐
Quora
quora.com › How-do-we-write-and-use-lambda-functions-in-pure-C-indirectly-instead-of-C
How do we write and use lambda functions in pure C indirectly instead of C++? - Quora
Answer (1 of 5): https://en.wikipedia.org/wiki/Anonymous_function#C_(non-standard_extension) > C (non-standard extension)[edit] The anonymous function is not supported by standard C programming language, but supported by some C dialects, such as GCC[52] and Clang. GCC[edit] GNU Compiler Colle...
🌐
Reddit
reddit.com › r/c_programming › simple lambda like functions in c
r/C_Programming on Reddit: simple lambda like functions in C
March 12, 2024 -

I was diving in reddit and I found the following post

I thought: maybe it is possible to do something similar in C with macros or something along those lines.

After some research, I found the following topic on GCC manual:
Statements and Declarations in Expressions

Well, with this construction, it's possible to instruct the compiler to define a function and call it in place, like we can do with lambdas. Look the example bellow:

#include <stdio.h>
int call_callback(void (*callback)()){
    callback();
}

void foo() {
    printf("foo\n");
}

int main(void) {
    call_callback(foo);
    call_callback(({
        void _() {
            printf("this is a lambda?\n");
        }
        (void (*)())_;
    }));
}

For me, it's very interesting. We encounter many situations and libraries that deal with callback functions, and personally, I often find myself declaring simple functions that are only called once. I believe that in these cases, this construct would work very well.

However, debugging it might be challenging.

🌐
Medium
madhawapolkotuwa.medium.com › mastering-lambda-functions-in-c-a-complete-guide-with-practical-examples-e2cc3f10dfce
Mastering Lambda Functions in C++: A Complete Guide with Practical Examples | by Madhawa Polkotuwa | Medium
November 1, 2024 - The first Lambda captures all variables by value, freezing their values inside the Lambda, while the second captures all by reference, making it sensitive to changes. ... Lambda functions in C++ are a powerful way to make your code cleaner and more concise, especially for small, local operations.
Find elsewhere
🌐
Quora
cstdspace.quora.com › How-do-we-write-and-use-lambda-functions-in-pure-C-indirectly-instead-of-C
How do we write and use lambda functions in pure C indirectly instead of C++? - C Programmers - Quora
Answer (1 of 3): There aren’t any lambdas in C, so you can’t. You can create a context structure, populate it, and give it as an argument to a callback function, but the syntax is grotty and it is not nicely handled for things that take callbacks don’t have a void* argument for that context.
🌐
Microsoft Learn
learn.microsoft.com › en-us › cpp › cpp › lambda-expressions-in-cpp
Lambda expressions in C++ | Microsoft Learn
Each instance of auto in a parameter list is equivalent to a distinct type parameter. auto y = [] (auto first, auto second) { return first + second; }; A lambda expression can take another lambda expression as its argument.
🌐
TutorialsPoint
tutorialspoint.com › significance-of-lambda-function-in-c-cplusplus
Significance of Lambda Function in C/C++
February 5, 2021 - Note: Lambda functions are a C++11 feature and are NOT available in C. They are part of the C++ standard, not C.
🌐
DZone
dzone.com › articles › all-about-lambda-functions-in-cfrom-c11-to-c17
All About Lambda Functions in C++ (From C++11 to C++17)
May 8, 2020 - Zero cost abstraction. Yes! You read it right. Lambda doesn't cost you performance, and it's as fast as a normal function. In addition, code becomes compact, structured, and expressive. ... In the above example, I have mentioned & in the capture list. This captures variable x and y as a reference.
🌐
SmartBear
smartbear.com › blog › c11-tutorial-lambda-expressions-the-nuts-and-bolts
C++11 Tutorial: Lambda Expressions — The Nuts and Bolts of Functional Programming
November 1, 2012 - In our example, the lambda expression reports whether the current accountant object in the vector emps gets a salary that is both lower than the upper limit and higher than the minimum wage.
🌐
W3Schools
w3schools.com › cpp › cpp_functions_lambda.asp
C++ Lambda Functions
You can also pass a lambda function as an argument to another function. This is useful when you want to tell a function what to do, not just what data to use. In the example below, we send a small lambda function to another function, which then runs it twice:
🌐
Learn C++
learncpp.com › cpp-tutorial › introduction-to-lambdas-anonymous-functions
20.6 — Introduction to lambdas (anonymous functions) – Learn C++
January 3, 2020 - Much like we can initialize a variable with a literal value (or a function pointer) for use later, we can also initialize a lambda variable with a lambda definition and then use it later. A named lambda along with a good function name can make code easier to read. For example, in the following snippet, we’re using std::all_of to check if all elements of an array are even:
🌐
Medium
medium.com › @briankworld › introduction-to-c-lambdas-and-using-them-with-standard-library-algorithms-bef29ef80dd8
Introduction to C++ Lambdas and Using Them with Standard Library Algorithms | by Brian | Medium
May 6, 2023 - A lambda expression in C++ is a shorthand syntax for defining an anonymous function object that can be used in place of a function pointer…
🌐
Medium
medium.com › @me4saurabh4u › understanding-lambda-functions-in-c-a-practical-guide-3daf7919a448
Understanding Lambda Functions in C++: A Practical Guide | by Saurabh Raj | Medium
December 25, 2023 - They are particularly useful in scenarios where a simple function is needed for a short duration, mostly as arguments for standard algorithms or for creating simple function objects. A lambda expression in C++ can be recognized by the [] (capture clause), followed by () (parameters), -> (optional return type), and {} (function body):
🌐
DEV Community
dev.to › glpuga › c-lambdas-for-beginners-313c
C++ lambdas, for beginners - DEV Community
September 14, 2020 - This is really important, because it means that any access to the instance members are still reference-like: by de-referencing this the lambda is accessing the original external variables, not copies of them! This is the reason some sources explain the capture [this] as capturing the object by reference. It's not exactly true, but it's close enough. Now, this detail can bite you hard, especially if you fall for thinking that [=] means that "everything gets captured by-copy", as in the following example: #include <iostream> #include <functional> #include <string> using namespace std; using Filt