Современный C++ и альтернативы на C

Lambdas C++ и closures на C

Lambda создаёт безымянный callable с captures; C передаёт контекст явно.

Что такое Lambdas C++ и closures на C?

Lambda создаёт безымянный callable с captures; C передаёт контекст явно.

Передавайте context в callback.

Важные моменты

  • Сначала поймите механизм на C.
  • Используйте RAII и value semantics для ownership.
  • Предпочитайте type-safe абстракции макросам и cast.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

int above(int value, void *context) {
    return value > *(int *)context;
}

int main(void) {
    int values[] = {2, 7, 4, 9};
    int threshold = 5;
    int count = 0;
    for (int index = 0; index < 4; ++index) {
        count += above(values[index], &threshold);
    }
    printf("%d\n", count);
}
Ожидаемый результат
2
C++
Запустить →
main.cpp
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector values{2, 7, 4, 9};
    int threshold = 5;
    auto above = [threshold](int value) {
        return value > threshold;
    };
    std::cout << std::count_if(values.begin(), values.end(), above)
              << '\n';
}
Ожидаемый результат
2

Сравнение C и C++

Функция C получает void* и приводит тип; lambda C++ захватывает threshold по значению, сохраняя тип.

C

C использует префиксы, callbacks, макросы и context-структуры.

C++

Язык предоставляет scoped и type-safe абстракции.

Практические задания

Запустите обе версии и изменяйте их, сравнивая гарантии языков.

  • Сначала напишите механизм на C.
  • Замените ручную очистку на RAII.
  • Измерьте allocation и virtual dispatch.