¿Podemos tener una función anidada en C? ¿Cuál es el uso de funciones anidadas? Si existen en C, ¿su implementación difiere de un compilador a otro?
¿Podemos tener una función anidada en C? ¿Cuál es el uso de funciones anidadas? Si existen en C, ¿su implementación difiere de un compilador a otro?
Respuestas:
No puede definir una función dentro de otra función en el estándar C.
Puede declarar una función dentro de una función, pero no es una función anidada.
gcc tiene una extensión de idioma que permite funciones anidadas . No son estándar y, como tales, dependen completamente del compilador.
No, no existen en C.
Se utilizan en lenguajes como Pascal por (al menos) dos razones:
Funciones anidadas no son una parte de ANSI C , sin embargo, que son parte de C de GNU .
No, no puede tener una función anidada en C
. Lo más cerca que puede llegar es declarar una función dentro de la definición de otra función. Sin embargo, la definición de esa función tiene que aparecer fuera de cualquier otro cuerpo de función.
P.ej
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
es visible más adelante en el archivo, esa declaración está dentro del alcance del resto de la unidad de traducción. Además, puede llamar a funciones en C sin una declaración visible en el alcance, incluso si no es recomendable.
Menciono esto ya que muchas personas que codifican en C ahora usan compiladores de C ++ (como Visual C ++ y Keil uVision) para hacerlo, por lo que es posible que pueda hacer uso de esto ...
Aunque aún no está permitido en C, si está utilizando C ++, puede lograr el mismo efecto con las funciones lambda introducidas en C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Como han respondido otros, el estándar C no admite funciones anidadas.
Las funciones anidadas se usan en algunos lenguajes para encerrar múltiples funciones y variables en un contenedor (la función externa) para que las funciones individuales (excluyendo la función externa) y las variables no se vean desde afuera.
En C , esto se puede hacer poniendo tales funciones en un archivo fuente separado. Defina la función principal como global y todas las demás funciones y variables como estáticas . Ahora solo la función principal está visible fuera de este módulo.
outer
-> nested
-> outer
-> nested
, entonces habrá dos marcos diferentes que se mantendrán int declared_in_outer
, por lo que no puede simplemente ponerlo declared_in_outer
como un global estático.
Para responder a su segunda pregunta, existen lenguajes que permiten definir funciones anidadas (se puede encontrar una lista aquí: nested-functions-language-list-wikipedia ).
En JavaScript, que es uno de los lenguajes más famosos, una de las funciones anidadas (que se llaman cierres) son:
para nombrar unos pocos...
O puede ser inteligente al respecto y usar el preprocesador a su favor ( 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
¿No es esta una función anidada en C? (la función displayAccounts ())
Sé que podría haber definido la función de manera diferente y pasar variables y lo que no, pero de todos modos funciona bien ya que necesitaba imprimir las cuentas varias veces.
(snipet tomado de una tarea escolar) ...
//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;
}