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
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;
}
🌐
Hackaday
hackaday.com › 2019 › 09 › 11 › lambdas-for-c-sort-of
Lambdas For C — Sort Of | Hackaday
November 2, 2023 - The map call ensures that the anonymous function is called once for each item. Modern C++ has lambda expressions. However, in C you have to define a function by name and pass a pointer — not a huge problem, but it can get messy if you have a lot of callback functions that you use only one time.
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
Does C use lambda expressions? - Stack Overflow
Sign up to request clarification or add additional context in comments. ... Save this answer. ... Show activity on this post. C does not support lambda expressions, nor any other ways (within the language's standard) to dynamically create functions -- all functions, per the standard, are created ... More on stackoverflow.com
🌐 stackoverflow.com
How does the lambda expression work
Lambdas are usually thought of as an alternative to a function, but it's more accurate to think of it as an alternative to an object. Objects can be called like functions using the "()" operator, just like they could be added together by defining a "+" operator. Objects which define operator() are called "functors". A functor is more powerful than a simple function, because it has data. For example, the object could have an int field which gets incremented each time the "()" operator is invoked, and that int could be used within the operator, to get different behavior each time it is called. A lambda is just a short and simple way of defining a functor. The functor's fields are your local variables wherever the lambda was declared (taken by reference or by copy), and the "()" operator is defined as the code block of your lambda. In other words, lambdas are merely an anonymous struct generated by the compiler so that you don't have to write one by hand. I'm on mobile, so I don't want to throw up a code example, sorry. But look at examples of functors to see what lambdas help you avoid writing. More on reddit.com
🌐 r/cpp_questions
24
7
December 9, 2023
Function composition in modern C++
What you want to do?Now you just ... this lambda. ... Both captures are “init captures” by value, the forward is there to move construct from potential rvalues. I’d suggest reading the linked post if you don’t understand what the code is doing ... Could you come up with at least one hypothesis of what OP might have wanted to achieve? Just to see if you've engaged with the idea or not ... [Grade 10: Composition of Functions] I don’t ... More on reddit.com
🌐 r/cpp
29
27
March 5, 2023
🌐
Reddit
reddit.com › r/c_programming › why does c not have lambdas/anonymous function expressions?
r/C_Programming on Reddit: Why does C not have lambdas/anonymous function expressions?
August 7, 2022 -

It would not seem to hard to implement to allow a programmer to use a construct similar to:

int (*add)(int, int) = (int(int x, int y)){return x+y;};

This would simplify code that requires callback functions such as qsort or bsearch or various UI libraries that use callbacks to define, for example, a buttons behavior when pressed. Is there any specific reason they elected not to support this, and require us to define named static functions instead?

Top answer
1 of 7
8
There are two basic ways to implement closures: A custom calling convention: Callers are aware they're calling a closure and so pass the closure context to the callee, perhaps as a hidden argument. Closures are nearly always implemented this way, including in C++. For C, as a lingua franca platforms would need to define this calling convention / ABI so that different implementers could all each others closures just as they can call each others functions. Since this doesn't exist, closures in language implementations using this approach are incompatible with C interop (ex. can't turn a C++ closure into a function pointer). Build a trampoline by allocating a little bit of executable memory, essentially like using a small JIT compiler. Callers do not need to be aware they're calling a closure, and a plain C calling convention is sufficient. GNU C closures are implemented this way, as are CPython's ctypes callbacks. However, frequently allocating executable memory requires significant trade-offs in performance or security. It may not even be possible on some platforms. This is also an implicit allocation — which is not in the spirit of C — and someone has to manage its lifetime. (GNU C manages it by using an automatic allocation.) Unless you're willing to make the trade-offs in the second approach — which is available to you if you use GCC — neither fits C well.
2 of 7
6
Why are people obsessed with making C like python or whatever language they learned first? It's like asking why my bicycle only has two wheels, when your red wagon has four.
🌐
GeeksforGeeks
geeksforgeeks.org › c++ › lambda-expression-in-c
Lambda Expression in C++ - GeeksforGeeks
Lambda expressions are anonymous and inline functions introduced in C++11 that allow writing small pieces of logic directly at the place of use.
Published   April 26, 2026
🌐
TutorialsPoint
tutorialspoint.com › significance-of-lambda-function-in-c-cplusplus
Significance of Lambda Function in C/C++
February 5, 2021 - Lambda Function − Lambda functions are anonymous inline functions that don't require any implementation outside the scope where they are defined. They provide a concise way to write small functions directly at the point of use.
🌐
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
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.
Find elsewhere
🌐
Learn C++
learncpp.com › cpp-tutorial › introduction-to-lambdas-anonymous-functions
20.6 — Introduction to lambdas (anonymous functions) – Learn C++
January 3, 2020 - Because of that, we are forced ... from the name and comments. ... A lambda expression (also called a lambda or closure) allows us to define an anonymous function inside another function....
🌐
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.

🌐
Programiz
programiz.com › cpp-programming › lambda-expression
C++ Lambda
C++ Lambda expression allows us to define anonymous function objects (functors) which can either be used inline or passed as an argument. In this tutorial, you will learn about C++ lambda expressions with the help of examples.
🌐
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...
🌐
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 - As all lambda expressions, ours begins with the lambda introducer []. Even without knowing the syntactic rules, you can guess what this lambda expression does: The executable statements between the braces look like an ordinary function body. That’s the essence of lambdas; they function (pun unintended) as locally-defined functions.
🌐
Built In
builtin.com › software-engineering-perspectives › c-plus-plus-lambda
C++ Lambda Expressions Explained | Built In
... Summary: C++ lambdas, introduced in C++11, are expressions that allow for defining anonymous function objects (functors). They enhance readability, support callbacks and reduce boilerplate code compared to traditional function objects.
🌐
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 - Lambda functions are a way to define anonymous functions right at the place where they are needed, often improving code readability and maintainability. They are particularly useful in scenarios where a simple function is needed for a short ...
🌐
Medium
medium.com › @weidagang › modern-c-lambda-expressions-63fc0c2b8186
Modern C++: Lambda Expressions. This blog post is part of the series… | by Dagang Wei | Medium
June 22, 2024 - Lambda expressions, introduced in C++11, are a powerful feature that can significantly streamline your code and make it more expressive. They offer a concise way to define anonymous functions directly within your code, exactly where you need them.
🌐
DEV Community
dev.to › sandordargo › lambda-expressions-in-c-4pj4
Lambda Expressions in C++ - DEV Community
September 4, 2020 - In the last parameter, we defined a lambda expression. It gets a character as a parameter and returns true or false depending on whether the passed in character is a digit or not. Luckily in the standard library, there is a function to do, meaning that we don't have to try to cast it, nor to check its ASCII value.
🌐
MC++ BLOG
modernescpp.com › index.php › c-core-guidelines-function-objects-and-lambas
C++ Core Guidelines: Function Objects and Lambdas – MC++ BLOG
September 29, 2017 - The same holds for the definition of the lambda expression lam (1) and its usage (2) inside the function. The undefined behavior is that the function makeLambda returns a lambda expression referencing the local variable local. And guess what value the call add10(5) will have inline (5)?
🌐
Intellipaat
intellipaat.com › home › blog › lambda expressions in c++
Lambda Expressions in C++ - Intellipaat
July 31, 2025 - A lambda expression is an anonymous function in C++ that can be defined inline without requiring a separate function declaration. It is commonly used in sorting, filtering, and modifying collections.