2011-11-11 17 views
6

ver el códigoDefinición de la función dentro de otra definición de función: ¿es válida?

#include<stdio.h> 

int main() 
{ 
    void test(void) 
    { 
     printf("test"); 
     return; 
    } 
printf("main"); 
return 0; 
} 

esta alumna trabaja muy bien y imposible dar ninguna advertencia y error. No entiendo por qué sucede esto? aquí he escrito una definición de función dentro de otra definición de función, ¿es válida?

EDITAR: si es así, ¿hay algún uso de esto?

Por qué gcc necesita agregar estas características como extensión ... debe haber algún uso de esto, ¿no?

+1

Parece un duplicado de: http: //stackoverflow.com/questions/666586/are-nested-functions-part-of-c-standard Quizás se interesado en ver: http: //stackoverflow.com/questions/1348095/why-are-nested-functions-not-supported-by-the-c-standard & http://www.informit.com/articles/article. aspx? p = 1676713 –

+0

@ another.anon.coward gracias por ese enlace ... –

Respuesta

6

El anidamiento de las definiciones de función depende de la extensión de GCC para que funcione. No está descrito por el estándar.

Si desea que su código funcione con otros compiladores, debe abstenerse de utilizar dichas técnicas. Además, si colaboras con otros desarrolladores, predigo que a muchos de ellos no les gustará el uso de estos constructos no estándar.

No soy experto con GCC, pero estoy bastante seguro de que hay opciones de compilación para deshabilitar las extensiones. Esto le permitirá obtener el compilador para asegurarse de que no está escribiendo código que no se compilará con otros compiladores.


En cuanto a su actualización hay usos para funciones anidadas. Pueden ayudar a la encapsulación al restringir el alcance y la visibilidad. Sin embargo, no hay ningún problema que no se pueda resolver de manera perfectamente adecuada sin funciones anidadas, lo que creo que explica por qué son una peculiaridad GCC rara vez utilizada.

+0

eres realmente genial ... has dado tantas respuestas a mi pregunta ... !! –

+0

¿Por qué la función de definición dentro de una función no está en los estándares (C89 y C99)? – Sahil

+3

@Sahil Porque C no fue diseñado de esa manera. –

1

Sé que GCC tiene esto como una extensión. No es, hasta donde yo sé, parte del estándar.

3

La definición de una función anidada (es decir, dentro de otra función) es válida, la única limitación es que el alcance de la función anterior está limitado por la función adjunta. Es como definir una variable local. Puede encontrar más información aquí: http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

2

La respuesta de Joachim acerca de que las funciones anidadas son una extensión de GCC es correcta; también preguntaste si hay algún uso: he visto el código fuente de cientos de proyectos y nunca vi a nadie usando esta extensión particular de GCC.

2

Sí, podemos definir una función en otra función. He compilado a continuación las líneas escritas en gcc y se ejecutó correctamente sin mostrar un error.

#include<stdio.h>; 
void main() 
{ 
    int sum() 
    { 
     int a=30, b=10, c=20, sum=0; 
     sum=a+b+c; 
     return sum; 
    } 
    int a; 
    a=sum(); 
    printf("Sum = %d", a); 
} 

O/t: 60

Cuestiones relacionadas