Czy możemy mieć funkcję zagnieżdżoną w C? Jaki jest pożytek z funkcji zagnieżdżonych? Jeśli istnieją w C, czy ich implementacja różni się od kompilatora do kompilatora?
Czy możemy mieć funkcję zagnieżdżoną w C? Jaki jest pożytek z funkcji zagnieżdżonych? Jeśli istnieją w C, czy ich implementacja różni się od kompilatora do kompilatora?
Odpowiedzi:
Nie można zdefiniować funkcji w ramach innej funkcji w standardzie C.
Możesz zadeklarować funkcję wewnątrz funkcji, ale nie jest to funkcja zagnieżdżona.
gcc ma rozszerzenie języka, które pozwala na zagnieżdżone funkcje . Są niestandardowe i jako takie są całkowicie zależne od kompilatora.
Nie, nie istnieją w C.
Są używane w językach takich jak Pascal z (co najmniej) dwóch powodów:
Funkcje zagnieżdżone nie są częścią ANSI C , jednak są one częścią GNU C .
Nie, nie możesz mieć funkcji zagnieżdżonej w C
. Najbliższe możliwe jest zadeklarowanie funkcji wewnątrz definicji innej funkcji. Definicja tej funkcji musi jednak pojawić się poza jakimkolwiek innym ciałem funkcji.
Na przykład
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
jest widoczna później w pliku, deklaracja ta jest objęta zakresem pozostałej części jednostki tłumaczeniowej. Poza ty może wywoływać funkcje w C bez widocznego deklaracji w zakresie, nawet jeśli nie jest to wskazane.
Wspominam o tym, ponieważ wiele osób kodujących w C korzysta teraz z kompilatorów C ++ (takich jak Visual C ++ i Keil uVision), aby to zrobić, więc możesz być w stanie wykorzystać to ...
Chociaż nie jest to jeszcze dozwolone w C, jeśli używasz C ++, możesz osiągnąć ten sam efekt za pomocą funkcji lambda wprowadzonych w C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Jak odpowiedzieli inni, standardowa C nie obsługuje funkcji zagnieżdżonych.
Funkcje zagnieżdżone są używane w niektórych językach do umieszczania wielu funkcji i zmiennych w kontenerze (funkcja zewnętrzna), dzięki czemu poszczególne funkcje (z wyjątkiem funkcji zewnętrznej) i zmienne nie są widoczne z zewnątrz.
W C można to zrobić, umieszczając takie funkcje w oddzielnym pliku źródłowym. Zdefiniuj główną funkcję jako globalną, a wszystkie inne funkcje i zmienne jako statyczne . Teraz tylko główna funkcja jest widoczna poza tym modułem.
outer
-> nested
-> outer
-> nested
, to będą dwie różne ramki int declared_in_outer
, więc nie możesz po prostu ustawić declared_in_outer
jako statycznej globalnej.
Odpowiadając na drugie pytanie, istnieją języki, które pozwalają na definiowanie funkcji zagnieżdżonych (lista znajduje się tutaj: nested-functions-language-list-wikipedia ).
W JavaScript, który jest jednym z najbardziej znanych języków, jedną z funkcji zagnieżdżonych (nazywanych domknięciami) są:
by wymienić tylko kilka...
Lub możesz być sprytny i wykorzystać preprocesor na swoją korzyść ( 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
czy to nie jest funkcja zagnieżdżona w C? (funkcja displayAccounts ())
Wiem, że mogłem zdefiniować funkcję inaczej i przekazywać zmienne, a co nie, ale i tak działa dobrze, ponieważ musiałem wielokrotnie drukować konta.
(wycinek pobrany z zadania szkolnego) ...
//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;
}