2010-04-09 36 views
62

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

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

+1

parece ser un duplicado de: http://stackoverflow.com/questions/1348095/why-are-nested-functions-not-supported-by- the-c-standard – zoli2k

+1

también http://stackoverflow.com/questions/666586/are-nested-functions-part-of-c-standard y http://stackoverflow.com/questions/2256647/is-it-possible -in-c-or-c-to-create-a-function-inside-another y http://stackoverflow.com/questions/957592/functions-inside-functions-in-c y otras tomadas de http: // stackoverflow.com/search?q=nested+functions+[c] – dmckee

+0

Use Python, es más fácil. –

Respuesta

76

No se puede definir una función dentro de otra función en la norma C.

Puede declarar una función dentro de una función, pero no es una función anidada.

gcc tiene a language extension that allows nested functions. No son estándares, y como tales son completamente dependientes del compilador.

26

No, ellos no existen en C.

Se utilizan en lenguajes como Pascal para (al menos) dos razones:

  1. Permiten descomposición funcional y sin espacios de nombres contaminantes. 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 alcance 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.
13

No, no puede 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.

E.g.

void f(void) 
{ 
    // Declare a function called g 
    void g(void); 

    // Call g 
    g(); 
} 

// Definition of g 
void g(void) 
{ 
} 
+3

Si la función g se declara de esta manera, ¿cuál será su alcance? –

+4

La declaración tiene un ámbito como cualquier otra declaración, por lo que en este caso hasta el final de la función. Por supuesto, una vez que la definición de 'g' es visible más adelante en el archivo, esa declaración está en el alcance del resto de la unidad de traducción. Además, puede llamar funciones en C sin una declaración visible en el alcance, incluso si no es aconsejable. –

12

funciones anidadas no son una parte de ANSI C, sin embargo, they are part ofGnu C.

+0

Qué significa si son parte de Gnu C –

+0

@Sachin Ayuda a comprender por qué el código C con funciones anidadas se puede compilar con gcc. La información tiene valor educativo. Además, la pregunta no especifica si está limitada solo a C89, C99 o GNU C – zoli2k

+3

Otros idiomas admitidos por GCC sí los tienen (ADA y Pascal que yo sepa), por lo que es probable que sea fácil de agregar a la implementación de C o que se haya agregado a C para poder prepararse para admitir los idiomas que lo requieren. – nategoose

2

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

Las funciones anidadas se utilizan en algunos idiomas para encerrar 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 static. Ahora solo la función principal está visible fuera de este módulo.

+0

Si hay recursividad 'outer'->' anidado'-> 'outer'->' anidado', entonces habría dos marcos diferentes que contienen 'int declared_in_outer', por lo que no se puede simplemente poner' declared_in_outer' como static global. –

3

Menciono esto porque muchas personas que codifican en C ahora usan compiladores de C++ (como Visual C++ y Keil uVision) para hacerlo, por lo que puede hacer uso de esto ...

Aunque todavía no está permitida en C, si estás usando C++, se puede lograr el mismo efecto con las funciones lambda introducidas en C++ 11:

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

    g(); 
} 
+2

La pregunta fue específicamente sobre C, no C++ – Virgile

+2

@Virgile - Y la pregunta también estableció específicamente "¿Están permitidas las funciones anidadas en cualquier otro idioma?". La respuesta de Jon me ayudó. – user1863152

-1

esto no es una función anidada en C ? (la función displayCuentas())

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

No es norma legal C. Si funciona con su compilador, es porque su compilador proporcionó una extensión al lenguaje C estándar; en cierto sentido, su compilador está compilando un idioma diferente, que, estrictamente hablando, no es C. –

+0

gracias por su contribución.Desde entonces, aprendí la forma correcta de declarar, definir y usar funciones. esto es un poco embarazoso mirar hacia atrás en>. < – midnightCoder

1

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

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

  • Para crear métodos de clase en los constructores de objetos.
  • Para lograr la funcionalidad de los miembros privados de la clase junto con los instaladores y getters.
  • No contaminar el espacio de nombre global (que se aplica a todos los idiomas, por supuesto).

para nombrar unos pocos ...