Макрос препроцессора, использующий символ вставки ^ в начале выражения

Глядя на эту страницу: http://www.mikeash.com/pyblog/friday-qa-2010-12-31-c-macro-tips-and-tricks.html

Я нашел этот фрагмент кода с синтаксисом ^{ ... }(), что делают каретки/скобки?

#define MAX(x, y) (^{ \
    int my_localx = (x); \
    int my_localy = (y); \
    return my_localx > my_localy ? (my_localx) : (my_localy); \
}())

Похоже, он создает анонимную функцию или что-то в этом роде. Как называется это понятие? Где я могу прочитать об этом?


person pyramation    schedule 27.07.2011    source источник
comment
К вашему сведению, это каре, а не морковь. ;)   -  person Jeff Mercado    schedule 28.07.2011
comment
@Джефф, у тебя достаточно представителей, чтобы это исправить...   -  person Carl Norum    schedule 28.07.2011
comment
Это действительно глупый пример, поскольку его можно было бы реализовать с помощью совершенно стандартной функции static inline. Единственным преимуществом макроса является универсальное программирование типов, которое они испортили локальными переменными фиксированного типа...   -  person R.. GitHub STOP HELPING ICE    schedule 28.07.2011
comment
@Carl: Ему было важно знать об этом, но недостаточно, чтобы это требовалось исправить. Отсюда и без редактирования, только комментарии...   -  person Jeff Mercado    schedule 28.07.2011
comment


Ответы (4)


Это блок С. Это очень похоже на анонимную функцию (в использовании, а не в структуре). Подробнее о них можно прочитать на сайте Майка Эша и в Документация Apple.

person Cajunluke    schedule 27.07.2011
comment
@Heath Поддерживается LLVM (и, возможно, последними версиями gcc) в C и C++ (и Objective-C++). Как упоминалось в ldav1s, это не стандарт (пока). - person Cajunluke; 28.07.2011
comment
@CajunLuke - о, хорошо. Я беспокоился, что с 20-летним опытом работы с C я не знаю, что это делает! - person Martin Beckett; 28.07.2011
comment
@CajunLuke, круто, может быть, мы сможем стандартизировать это вместе с __try и declspec. - person Heath Hunnicutt; 28.07.2011

Это блок. Это не стандартный C, но он поддерживается компилятором Apple LLVM (около Xcode 3.2 IIRC и более поздних версий). См. здесь и здесь для получения более подробной информации.

Это не только для Objective-C, но также является частью компиляторов C и C++.

person ldav1s    schedule 27.07.2011


Это блок C, который создаст анонимную функцию.

Обратите внимание, что он будет создавать вызовы к системному API для обработки этих вызовов, не знаю насчет Mac, но для iOS система среды выполнения должна быть версии 3.2 или более поздней, чтобы поддерживать эти вызовы.

person fbafelipe    schedule 27.07.2011