Bisakah kita memiliki fungsi bersarang di C? Apa gunanya fungsi bertingkat? Jika mereka ada di C apakah implementasinya berbeda dari kompilator ke kompilator?
Bisakah kita memiliki fungsi bersarang di C? Apa gunanya fungsi bertingkat? Jika mereka ada di C apakah implementasinya berbeda dari kompilator ke kompilator?
Jawaban:
Anda tidak dapat menentukan fungsi dalam fungsi lain dalam standar C.
Anda bisa mendeklarasikan fungsi di dalam suatu fungsi, tapi itu bukan fungsi bertingkat.
gcc memiliki ekstensi bahasa yang memungkinkan fungsi bertingkat . Mereka tidak standar, dan karenanya sepenuhnya bergantung pada kompiler.
Tidak, mereka tidak ada di C.
Mereka digunakan dalam bahasa seperti Pascal karena (setidaknya) dua alasan:
Fungsi bersarang bukan merupakan bagian dari ANSI C , bagaimanapun, mereka adalah bagian dari Gnu C .
Tidak, Anda tidak dapat memiliki fungsi bertingkat di C
. Hal terdekat yang bisa Anda lakukan adalah mendeklarasikan suatu fungsi di dalam definisi fungsi lain. Definisi fungsi itu harus muncul di luar badan fungsi lainnya.
Misalnya
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
terlihat nanti di file deklarasi itu berada dalam cakupan unit terjemahan lainnya. Selain itu, Anda dapat memanggil fungsi di C tanpa deklarasi yang terlihat dalam cakupan meskipun tidak disarankan.
Saya menyebutkan ini karena banyak orang yang mengkodekan dalam C sekarang menggunakan kompiler C ++ (seperti Visual C ++ dan Keil uVision) untuk melakukannya, jadi Anda mungkin dapat memanfaatkan ini ...
Meskipun belum diizinkan di C, jika Anda menggunakan C ++, Anda dapat memperoleh efek yang sama dengan fungsi lambda yang diperkenalkan di C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Seperti yang telah dijawab orang lain, C standar tidak mendukung fungsi bertingkat.
Fungsi bersarang digunakan dalam beberapa bahasa untuk memasukkan beberapa fungsi dan variabel ke dalam wadah (fungsi luar) sehingga fungsi individu (tidak termasuk fungsi luar) dan variabel tidak terlihat dari luar.
Di C , ini dapat dilakukan dengan meletakkan fungsi-fungsi seperti itu dalam file sumber terpisah. Tentukan fungsi utama sebagai global dan semua fungsi serta variabel lainnya sebagai statis . Sekarang hanya fungsi utama yang terlihat di luar modul ini.
outer
-> nested
-> outer
-> nested
, maka akan ada dua penahan frame yang berbeda int declared_in_outer
, jadi Anda tidak bisa hanya menempatkan declared_in_outer
sebagai global statis.
Untuk menjawab pertanyaan kedua Anda, ada bahasa yang memungkinkan untuk menentukan fungsi bertingkat (daftarnya dapat ditemukan di sini: nested-functions-language-list-wikipedia ).
Dalam JavaScript, yang merupakan salah satu bahasa yang paling terkenal, salah satu dari fungsi bersarang (yang disebut closures) adalah:
untuk beberapa nama ...
Atau Anda bisa pintar tentang itu dan menggunakan preprocessor untuk keuntungan Anda ( 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
apakah ini bukan fungsi bersarang di C? (fungsi displayAccounts ())
Saya tahu saya dapat mendefinisikan fungsi secara berbeda dan meneruskan variabel dan apa yang tidak, tetapi bagaimanapun, berfungsi dengan baik karena saya perlu mencetak akun beberapa kali.
(snipet diambil dari tugas sekolah) ...
//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;
}