C'de iç içe geçmiş bir fonksiyona sahip olabilir miyiz? İç içe geçmiş işlevlerin kullanımı nedir? C de varlarsa, uygulamaları derleyiciden derleyiciye farklılık gösterir mi?
C'de iç içe geçmiş bir fonksiyona sahip olabilir miyiz? İç içe geçmiş işlevlerin kullanımı nedir? C de varlarsa, uygulamaları derleyiciden derleyiciye farklılık gösterir mi?
Yanıtlar:
Standart C'de başka bir işlev içinde bir işlev tanımlayamazsınız.
Sen edebilirsiniz beyan bir fonksiyonun bir işlev içini, ama iç içe işlev değil.
gcc, iç içe geçmiş işlevlere izin veren bir dil uzantısına sahiptir . Standart değildirler ve bu nedenle tamamen derleyiciye bağlıdırlar.
Hayır, C'de yoklar.
Pascal gibi dillerde (en az) iki nedenden dolayı kullanılırlar:
İç içe geçmiş işlevler ANSI C'nin bir parçası değildir , ancak bunlar Gnu C'nin parçasıdır .
Hayır, içinde yuvalanmış bir işleve sahip olamazsınız C
. Gelebileceğiniz en yakın şey, başka bir işlevin tanımı içinde bir işlev bildirmektir. Yine de, bu işlevin tanımı başka herhangi bir işlev gövdesinin dışında görünmelidir.
Örneğin
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
daha sonra dosyada göründüğünde, deklarasyon çeviri biriminin geri kalanı için kapsam dahilindedir. Buna ek olarak yapabilirsiniz bu tavsiye edilmez bile kapsamda görünür bir bildiri olmadan C işlevleri çağırmak.
Bundan bahsediyorum, çünkü C kodlama yapan birçok kişi artık bunu yapmak için C ++ derleyicileri (Visual C ++ ve Keil uVision gibi) kullanıyor, bu yüzden bundan faydalanabilirsiniz ...
Henüz C'de izin verilmese de, C ++ kullanıyorsanız, C ++ 11'de sunulan lambda işlevleriyle aynı etkiyi elde edebilirsiniz:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Diğerlerinin de yanıtladığı gibi, standart C yuvalanmış işlevleri desteklemez.
İç içe geçmiş işlevler, bazı dillerde, birden çok işlevi ve değişkeni bir kapta (dış işlev) içine almak için kullanılır, böylece tek tek işlevler (dış işlev hariç) ve değişkenler dışarıdan görülmez.
In C , bu ayrı bir kaynak dosyada tür fonksiyonları koyarak yapılabilir. Ana işlevi global, diğer tüm işlevleri ve değişkenleri statik olarak tanımlayın . Artık bu modülün dışında yalnızca ana işlev görülebilir.
outer
-> nested
-> outer
-> nested
, o zaman tutan iki farklı çerçeve olacaktır int declared_in_outer
, bu yüzden sadece declared_in_outer
statik bir global olarak koyamazsınız .
İkinci sorunuzu cevaplamak için, iç içe geçmiş işlevleri tanımlamaya izin veren diller vardır (burada bir liste bulunabilir: yuvalanmış işlevler-dil-listesi-wikipedia ).
Bu dillerin en ünlülerinden biri olan JavaScript'te, iç içe geçmiş işlevlerden biri (kapanışlar denir) şunlardır:
birkaç isim...
Ya da bu konuda akıllı davranabilir ve ön işlemciyi kendi yararınıza kullanabilirsiniz ( source.c
):
#ifndef FIRSTPASS
#include <stdio.h>
//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS
main(){
#else
int global = 2;
int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
func();}
#endif
bu C'deki iç içe geçmiş bir işlev değil mi? (displayAccounts () işlevi)
İşlevi farklı şekilde tanımlayıp değişkenler geçirebileceğimi ve hesapların birden çok kez yazdırılması gerektiğinden neyin işe yaramadığını biliyorum.
(bir okul ödevinden alınan pasaj) ...
//function 'main' that executes the program.
int main(void)
{
int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}}; //multidimensional customer data array.
int x, y; //counters for the multidimensional customer array.
char inquiry; //variable used to store input from user ('y' or 'n' response on whether or not a recession is present).
//function 'displayAccounts' displays the current status of accounts when called.
void displayAccounts(void)
{
puts("\t\tBank Of Despair\n\nCustomer List:\n--------------");
puts("Account # Credit Limit\t Balance\n--------- ------------\t -------");
for(x = 0; x <= 2; x++)
{
for(y = 0; y <= 2; y++)
printf("%9d\t", customerArray[x][y]);
puts("\n");
}
}
displayAccounts(); //prints accounts to console.
printf("Is there currently a recession (y or n)? ");
//...
return 0;
}