Макрос на предпроцесора, използващ символ карета ^ в началото на израз

Гледайки тази страница: 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
FYI, това е карет, а не морков. ;)   -  person Jeff Mercado    schedule 28.07.2011
comment
@Jeff, имаш много представители, за да поправиш това...   -  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
възможен дубликат на знак за каретка между типове вместо променливи, заобиколен в скоби   -  person jscs    schedule 05.07.2014


Отговори (4)


Това е C блок. Това е доста като анонимна функция (в употреба, не в структура). Можете да прочетете повече за тях на сайта на Майк Аш и в Документация на 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, но се поддържа от LLVM компилатора на Apple (около 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