Блоки (расширение языка Си)

Блоки (расширение языка Си)

Блоки (англ. Blocks) — это добавленное Apple нестандартное расширение языков программирования C/C++/Objective-C, которое использует лямбда-подобный синтаксис для создания замыканий.

Apple создала блоки для облегчения написания приложений для платформы Grand Central Dispatch[1][2], но блоки могут использоваться и вне контекста данной платформы так же, как используются замыкания в других языках программирования. Apple реализовала блоки в собственной ветке компилятора GCC. Языковая поддержка выполнения блоков также доступна как часть проекта LLVM.

Как и функции, блоки могут принимать аргументы и определять собственные локальные переменные. Но в отличие от обычных функций, значения переменных в блоке могут устанавливаться из окружающего констекста (по сути блок «видит» локальные переменные функции, создавшей блок). Определение блока создает скрытый объект, который содержит ссылку на код блока и «снимок» локальных переменных текущего окружения (внешней функции) во время его выполнения. Позже блок может быть вызван так же, как и обычная функция. Блок может быть присвоен переменной, передан функции и ведет себя как обычный указатель на функцию, правда прикладной программист должен пометить блок специальным оператором, если он использует его вне области видимости, где был определен данный блок.

Получив значение блока, код может выполнить его в любой момент, используя синтаксис вызова обычной функции.

Пример

Простым примером, использующим изменяющееся состояние окружающего контекста, является целочисленный итератор: [3]:

#include <stdio.h>
#include <Block.h>
typedef int (^IntBlock)();
 
IntBlock MakeCounter(int start, int increment) {
        __block int i = start;
 
        return Block_copy( ^ {
                int ret = i;
                i += increment;
                return ret;
        });
 
}
 
int main() {
        IntBlock mycounter = MakeCounter(5, 2);
        printf("First call: %d\n", mycounter());
        printf("Second call: %d\n", mycounter());
        printf("Third call: %d\n", mycounter());
 
        /* because it was copied, it must also be released */
        Block_release(mycounter);
 
        return 0;
}
/* Output:
        First call: 5
        Second call: 7
        Third call: 9
*/

Для компиляции с помощью clang требуются дополнительные опции:

clang -fblocks blocks-test.c -lBlocksRuntime

См. также

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать курсовую

Полезное


Смотреть что такое "Блоки (расширение языка Си)" в других словарях:

  • расширение языка SQL — Процедурное расширение языка SQL фирмы Oracle. В PL/SQL скомбинированы легкость и гибкость SQL с процедурными функциональными возможностями структурного языка программирования, как, например, IF ...THEN, WHILE и LOOP. Даже если программа на… …   Справочник технического переводчика

  • Grand Central Dispatch — (GCD), намек на название центрального вокзала в Нью Йорке Grand Central Terminal, технология Apple предназначенная для создания приложений, использующих преимущества многоядерных процессоров и других SMP систем[1]. Эта технология является… …   Википедия

  • Блок — Блок: В Викисловаре есть статья «блок» Блок (механика)  простой механизм: колесо с жёлобом по окружности, вращающееся вокруг своей оси …   Википедия

  • Синтаксический сахар — Эта статья нуждается в дополнительных источниках для улучшения проверяемости. Вы можете помочь улучшить эту статью, добавив ссы …   Википедия

  • PL/pgSQL — (Procedural Language/PostGres Structured Query Language  процедурное расширение языка СУБД добавляет управляющие конструкции к стандарту SQL; допускает сложные вычисления; может использовать все объекты БД, определенные пользователем; прост в… …   Википедия

  • Российская Советская Федеративная Социалистическая Республика —         РСФСР.          I. Общие сведения РСФСР образована 25 октября (7 ноября) 1917. Граничит на С. З. с Норвегией и Финляндией, на З. с Польшей, на Ю. В. с Китаем, МНР и КНДР, а также с союзными республиками, входящими в состав СССР: на З. с… …   Большая советская энциклопедия

  • Mathcad — Mathcad …   Википедия

  • Китайская Национальная Нефтегазовая корпорация — (CNPC) Китайская Национальная Нефтегазовая корпорация это одна из крупнейших нефтегазовых компаний мира Китайская Национальная Нефтегазовая корпорация занимается добычей нефти и газа, нефтехимическим производством, продажей нефтепродуктов,… …   Энциклопедия инвестора

  • Египет — I Египет (Древний         древнее государство в нижнем течении р. Нил, в северо восточной Африке.          Исторический очерк.          Заселение территории Е. восходит к эпохе палеолита. В 10 6 м тыс. до н. э., когда климат был более влажным,… …   Большая советская энциклопедия

  • Российская Советская Федеративная Социалистическая Республика, РСФСР (народное образование и культурно-просветительные учреждения) — VIII. Народное образование и культурно просветительные учреждения = История народного образования на территории РСФСР уходит в глубокую древность. В Киевской Руси элементарная грамотность была распространена среди разных слоев населения, о чём… …   Большая советская энциклопедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»