2012-04-13 33 views
7

C dilinde işlev ifadeleri kullanmak mümkün müdür?C, işlev ifadelerini destekliyor mu?

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

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

Ben artık şöyle bir şey yapmak istiyorum:

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

C mümkün böyle bir şey var mı Örneğin, ben (main işlev içinde) aşağıdaki kod parçacığını var?

+0

Beni yanlış anlamayın, ama bu yüzden C++ 'yı seviyorum, bu size C'den daha ucuz bir fiyat verir! – AraK

+1

@AraK: C'den daha ucuz fiyat için? Burada "ucuz" ne anlama geliyor? C++ yolu muhtemelen daha yavaş, değil mi? – thejh

+1

Daha ucuz burada derleyicinin maksimum performansı elde etmek için soyutlamayı daraltabildiği anlamına gelir. Örneğin, fonksiyon göstergelerinin kullanımıyla bir functor (veya lambda) kullanımını karşılaştırın. Takma adlandırma özelliği, kodun en iyi şekilde üretilmesinde yardımcı olmaz. – AraK

cevap

7

Bir kelimede, Hayır. En azından Javascript benzeri bir sözdiziminde değil. Fonksiyon göstergeleri sizin alacağınız kadar yakın. İki sözdizimsel arasında çok az fark var. Eğer kapanma veya içsel işlevlerin davranışlarını arıyorsanız, o zaman onları kesinlikle görmeyeceksiniz.

1

Nesne-C blokları, kapaklar vb. Gibi bir şey kesinlikle değil. Ama bunun yerine işlev işaretçileri'u kullanma hakkında ne dersiniz?

+1

İlk kod parçasında yaptığı şey buydu. – Chuck

+0

@Chuck hmm ... aslında evet. –

4

Standart C değil, no. Apple, bunu yapmanıza izin verecek ve standartlaştırmaya sunulmuş olan bloklar olarak adlandırılan bir özellik sunmuştur, ancak henüz mevcut değildir (eğer bunu başaracaksa). Apple'ın sözdizimi şu şekildedir:

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

Temelde (ifadelerde dönüş türü için ve çıkarım) işaretçi ^ ile değiştirilir * ile sözdizimi işlev oluyor.

+0

Oh, kulağa ilginç geliyor. Eh, bunu gcc'de kullanamadığım sürece, muhtemelen kullanmam. :( – thejh

+0

Apple'ın mimarisi veya başka bir derleyici için bir gcc C uzantısı nedir? – Jack

+0

@Jack: Apple'ın şu anda desteklenmeyen GCC çatalında ve ayrıca Clang'da (http://clang.llvm.org) Apple'ın ana kurumsal sponsoru olan Clang (Clang kullanırsanız, dil uzantısını etkinleştirmek için -fblocks bayrağını geçmek isteyeceksiniz.) – Chuck

2

Sen yapamaz düz C. Ancak yapabilirsiniz makro ile bu sahte: Ben daha taşınabilir olmasını örnek yeniden kodlanmış ettik

#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; 
} 

DÜZENLEME - GCC blokları kullanmadan uzantı.