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
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
🌐
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.
Why isn't C considered a functional language? Jun 11, 2014
r/compsci
12y ago
Lambdas in C Jul 1, 2011
r/programming
15y ago
How does everyone handle Anonymous/Lambda Functions Dec 23, 2024
r/ProgrammingLanguages
last yr.
C-style callbacks and lambda functions Mar 26, 2019
r/cpp
7y ago
More results from reddit.com
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
How does the lambda expression work
A lambda simplifies code for a two part situation: You have some generalized code that basically says "When we're ready to act, please tell me what C++ code to run" and You want to run the C++ function code once and only once. You don't want to type out lots of boilerplate function definition stuff. What made lambdas click for me is when I realized they're just predicates or struct functors in simpler form. Imagine that the compiler basically expands lambdas into the old fashioned struct functors. That's it. Lambdas will make this cplusplus.com example cleaner: https://cplusplus.com/reference/forward_list/forward_list/remove_if/ . I'm cleaning up the code a bit and reposting it below. The example is about using a linked list with items, and then removing items of a given criteria. Because you don't have access to the nodes, and iterators aren't really a clean way to do this, we end up needing to pass in logic. A function predicate and a functor, not exciting yet... #include #include // A function bool single_digit(const int& value) { return (value < 10); } // A functor struct oddFunctor { bool operator() (const int& value) { return (value % 2) == 1; } }; int main() { std::forward_list mylist = { 7, 80, 7, 15, 85, 52, 6 }; mylist.remove_if(single_digit); // mylist now only contains 80 15 85 52 mylist.remove_if(oddFunctor()); // mylist now only contains 80 52 return 0; } Now let's say we want to make it even more flexible. Instead of just checking if a number is odd, we want to remove all numbers divisible by something the user specifies. Redoing that with lambdas, and adding another example. This is exciting #include #include // A messier functor struct DivisibleByFunctor { public: DivisibleByFunctor(const int divisibleValue) { this->divisibleValue = divisibleValue; } bool operator() (const int& value) { return (value % divisibleValue) == 0; } private: unsigned int divisibleValue{}; }; int main() { std::forward_list mylist = { 7, 80, 7, 15, 85, 52, 6 }; std::forward_list secondlist = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13 }; std::forward_list thirdlist = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13 }; // Lambda! The function is gone! All logic here is in one line. myList will contain 80 15 85 52 mylist.remove_if([](const int& value) {return (value < 10); }); // Lambda! The struct is gone! All logic here is in one line. myList will contain 80 52 mylist.remove_if([](const int& value) {return (value % 2) == 1; }); int divisibleValue; std::cout << "Values divisible by this should be removed: "; std::cin >> divisibleValue; // Ugly functor way. Boo! Requires a messy struct up above secondlist.remove_if(DivisibleByFunctor(divisibleValue)); // Lambda with capture of a local variable! No struct needed! All logic in one line! thirdlist.remove_if([divisibleValue](const int& value) { return (value % divisibleValue) == 0; }); return 0; } More on reddit.com
🌐 r/cpp_questions
24
7
December 9, 2023
Function composition in modern C++
If you use a forward macro and handle the 1-function composition case as a separate overload, this looks cleaner: template auto compose(F&& arg) { return FWD(arg); } template auto compose(F&& arg, Fs&& ...args) { return [fun = FWD(arg), ...functions = FWD(args)](Xs&& ...xs) mutable { return compose(FWD(functions)...)(std::invoke(FWD(fun), FWD(xs)...)); }; } Or you can implement a tuple_fold: template auto compose(F&& arg, Fs&& ...args) { return [fun = FWD(arg), ... functions = FWD(args)](Xs &&...xs) mutable { return tuple_fold( std::forward_as_tuple(FWD(functions)...), std::invoke(FWD(fun), FWD(xs)...), [](auto&& x, auto&& f) -> decltype(auto) { return std::invoke(FWD(f), FWD(x)); } ); }; } More on reddit.com
🌐 r/cpp
29
27
March 5, 2023
Why does C not have lambdas/anonymous function expressions?
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. More on reddit.com
🌐 r/C_Programming
35
6
August 7, 2022
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.
🌐
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.
🌐
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
🌐
TutorialsPoint
tutorialspoint.com › article › significance-of-lambda-function-in-c-cplusplus
Significance of Lambda Function in C/C++
March 15, 2026 - Note: Lambda functions are a C++11 feature and are NOT available in C. They are part of the C++ standard, not C.
Find elsewhere
🌐
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.

🌐
Quora
quora.com › Does-C-support-lambda-functions
Does C support lambda functions? - Quora
Answer (1 of 2): Does C support lambda functions? No. C has function pointers, but C does NOT have first class functions and does not treat functions as objects. This means that function identifiers cannot be rebinded at runtime, and also means that closures and variable captures are not an ava...
🌐
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...
🌐
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 - As you can see, this compact expression does the work of a complete function. Now, let’s break down its individual parts: Capture Clause (Optional): This specifies which variables from the surrounding scope the lambda can access.
🌐
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 - Parameters: Defines inputs for the Lambda, similar to regular function parameters. Return Type: Specifies the type of value the Lambda will return (optional, as the compiler can infer it in many cases).
🌐
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.
🌐
Microsoft Learn
learn.microsoft.com › en-us › cpp › cpp › lambda-expressions-in-cpp
Lambda expressions in C++ | Microsoft Learn
In C++11 and later, a lambda expression—often called a lambda—is a convenient way of defining an anonymous function object (a closure) right at the location where it's invoked or passed as an argument to a function.
🌐
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…
🌐
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 - One highlight of C++11 is lambda expressions: function-like blocks of executable statements that you can insert where normally a function call would appear. Lambdas are more compact, efficient, and secure than function objects.
🌐
Wikipedia
en.wikipedia.org › wiki › Anonymous_function
Anonymous function - Wikipedia
2 hours ago - In computer programming, an anonymous function (function literal, lambda function, or block) is a function definition that is not bound to an identifier. Anonymous functions are often arguments being passed to higher-order functions or used for constructing the result of a higher-order function ...
🌐
Intellipaat
intellipaat.com › home › blog › lambda expressions in c++
Lambda Expressions in C++ - Intellipaat
July 31, 2025 - The capture clause in the lambda expression is used to describe how the external variables from the surrounding scope are accessed within the lambda. It allows the lambda to directly use the external variables without passing them as function parameters.