Función anidada en C

¿Podemos tener una función anidada en C? ¿Para qué sirven las funciones anidadas? Si existen en C ¿difiere su implementación del comstackdor al comstackdor?

¿Están permitidas las funciones anidadas en cualquier otro idioma? Si es así, ¿cuál es su significado?

No puede definir una función dentro de otra función en C. estándar

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ándares, y como tales son completamente dependientes del comstackdor.

No, no existen en C.

Se usan en idiomas como Pascal por (al menos) dos razones:

  1. Permiten la descomposición funcional sin contaminar espacios de nombres. Puede definir una única función visible públicamente que implemente alguna lógica compleja al confiar en una o más funciones anidadas para dividir el problema en piezas lógicas más pequeñas.
  2. Simplifican el paso de parámetros en algunos casos. Una función anidada tiene acceso a todos los parámetros y algunas o todas las variables en el scope de la función externa, por lo que la función externa no tiene que pasar explícitamente un montón de estado local en la función anidada.

No, no puedes tener una función anidada en C Lo más cerca que puede venir 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) { } 

Las funciones anidadas no son parte de ANSI C , sin embargo, son parte de Gnu C.

Menciono esto ya que muchas personas que codifican en C ahora usan comstackdores 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á usando C ++, puede lograr el mismo efecto con las funciones lambda introducidas en C ++ 11:

 void f() { auto g = [] () { /* Some functionality */ } g(); } 

Como otros han respondido, el estándar C no admite funciones anidadas.

Las funciones anidadas se utilizan en algunos idiomas para incluir múltiples funciones y variables en un contenedor (la función externa) de modo que las funciones individuales (excluida la función externa) y las variables no se vean desde fuera.

En C , esto se puede hacer colocando dichas 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.

Para responder a su segunda pregunta, hay idiomas que permiten definir funciones anidadas (se puede encontrar una lista aquí: nested-functions-language-list-wikipedia ).

En JavaScript, que es uno de los más famosos de esos idiomas, algunos usos de las funciones anidadas (que se llaman cierres) son:

  • Para crear métodos de clase en constructores de objetos.
  • Para lograr la funcionalidad de los miembros privados de la clase junto con setters y getters.
  • No contaminar el espacio de nombres global (eso vale para todos los idiomas, por supuesto).

para nombrar unos pocos…

¿esta no es una función anidada en C? (la función mostrarCuentas ())

Sé que podría haber definido la función de manera diferente y las variables pasadas 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; }