2012-04-13 4 views
7

Можно ли использовать выражения функций в C? Например, у меня есть следующий фрагмент кода (внутри функции main):Поддерживает ли C выражения функции?

void print_line(char *data) { 
    printf("%s\n", data); 
} 

// print all elements in my_list 
list_foreach(&my_list, print_line); 

я хотел бы сделать что-то вроде этого, вместо:

list_foreach(&my_list, void (char *data) { 
    printf("%s\n", data); 
}); 

ничего подобного, что возможно в C?

+0

Не поймите меня неправильно, но именно поэтому я люблю C++, это дает вам это и многое другое по более низкой цене, чем C! – AraK

+1

@AraK: Для более дешевой цены, чем C? Что здесь означает «дешевле»? Возможно, путь C++ медленнее, нет? – thejh

+1

Дешевле здесь означает, что компилятор способен свернуть абстракцию, чтобы получить максимальную производительность. Сравните, например, использование функтора (или лямбда) с использованием указателей функций. Введение aliasing не очень помогает в создании лучшего кода. – AraK

ответ

7

Одним словом, Нет. По крайней мере, не в синтаксисе, подобном Javascript. Указатели функций находятся как можно ближе. Между ними синтаксически мало различий. Если вы ищете поведение закрытий или внутренних функций, то вы определенно не увидите их в ближайшее время.

1

Определенно нет ничего подобного Objective-C блоков, затворов и т. Д. Но как насчет использования указателей функций?

+1

Вот что он делал в своем первом фрагменте кода. – Chuck

+0

@ Чак хм ... на самом деле да. –

4

Не в стандарте C, нет. Apple представила функцию, называемую блоки, которая позволит вам сделать это, и она была отправлена ​​для стандартизации, но она еще не существует (если она когда-либо пройдет). Синтаксис от Apple выглядит следующим образом:

list_foreach(my_list, ^(char *data) { 
    printf("%s\n", data); 
}); 

Это в основном функционирует синтаксис указателей с * заменен ^ (и вывод для типа возвращаемого значения в выражениях).

+0

О, это звучит интересно. Ну, пока я не могу использовать его в gcc, я, вероятно, не буду его использовать. :( – thejh

+0

Где я могу найти его? Это расширение gcc C для архитектуры яблока или другого компилятора? – Jack

+0

@Jack: он находится в не поддерживаемой Apple вилке GCC, а также в Clang (http://clang.llvm.org) , в которой Apple является основным корпоративным спонсором. (Если вы используете Clang, я думаю, вы захотите передать флаг -fblocks, чтобы включить расширение языка.) – Chuck

2

Вы не можете сделать это в простом C. Однако вы можете подделать это с макросом:

#define FOR_EACH(type, x, array, size, code) \ 
       do { \ 
         int i; \ 
         for (i=0; i<size; ++i) { \ 
         type x = array[i]; \ 
         code \ 
         } \ 
       } while(0) 

int main() 
{ 
    int arr[] = {0,1,2,3,4,5,6}; 
    FOR_EACH(int, x, arr, 7, printf("%d ", 1 << x);); 

    return 0; 
} 

EDIT
Я перекодируюсь примером, чтобы быть более портативным - без использования GCC блоков расширение.

Смежные вопросы