¿Por qué la declaración de funciones es obligatoria en C++ y no en C?

3 minutos de lectura

Entonces, uno de mis exámenes anteriores tenía esta pregunta, y hasta ahora he estado leyendo que no necesita una declaración en ninguno de los idiomas.

¿Lo cual está bien? ¿C++ dará un error si no hay declaración, o se ejecutará?

  • stackoverflow.com/questions/645778/…

    – método auxiliar

    3 mayo 2011 a las 23:28

  • La pregunta es, ¿por qué él necesitar responde ya que el ya sabe la ¿respuesta?

    – Alexander Gessler

    3 mayo 2011 a las 23:35


  • @Alexander Ahh… paradójico. Jon Skeet podría responder a eso.

    – zengr

    4 de mayo de 2011 a las 0:14

  • @Alexander: Para estar seguro. Demasiadas respuestas contradictorias habían surgido antes.

    – Achint

    4 mayo 2011 a las 19:59

  • @Acint: perdóname, estaba hurgando en el hecho de que 42 tiene un significado muy especial cuando se trata de responder algo. No quise decir que la pregunta no estaba bien.

    – Alexander Gessler

    4 mayo 2011 a las 20:01


AnT destaca con el avatar de usuario de Rusia
AnT apoya a Rusia

En una discusión que involucra tanto a C como a C++, la “declaración de función” es un término bastante vago. Estos lenguajes son significativamente diferentes en este sentido.

En el lenguaje C++ solo hay un tipo de declaración de función: declaración con todos los tipos de parámetros y tipo de retorno. Tales declaraciones son necesarias porque el lenguaje C++ admite la función sobrecargando. Para elegir qué función llamar, el compilador necesita saber todo acerca de la función y necesita saber qué versiones sobrecargadas de la función están disponibles. Si “olvida” declarar alguna versión sobrecargada, no será considerada por la resolución de sobrecarga. Esa es al menos una de las razones por las que las declaraciones de funciones son necesarias en C++.

En lenguaje C hay dos tipos de declaraciones de funciones: no prototipo declaraciones y prototipo declaraciones (o simplemente prototipos). Un prototipo en C es bastante similar a la declaración de C++: incluye todos los tipos de parámetros. Siempre se han requerido prototipos en C estándar para funciones variádicas (funciones con ... parámetros). Para funciones no variádicas prototipo las declaraciones no son requeridas incluso hoy. Pero a partir de C99 al menos no prototipo se requieren declaraciones para todas las demás funciones. En la versión anterior C89/90 de las declaraciones de funciones de lenguaje para funciones no variables no se requerían.

Entonces, eso básicamente debería responder a tu pregunta. En C++, las declaraciones de funciones son necesarias porque las características del lenguaje dependen de ellas de forma crítica. En el C moderno, las declaraciones de funciones también son necesarias solo para hacer que el código sea más seguro. En versiones anteriores de C, las declaraciones de funciones no se requerían principalmente simplemente porque el lenguaje estaba definido para funcionar sin ellas.

Avatar de usuario de Justin
justin

Las declaraciones de funciones en C no son obligatorias por razones de compatibilidad heredada/hacia atrás; si fueran obligatorias, algún código antiguo/heredado en algún lugar dejaría de compilarse.

Supongo que son obligatorios en C ++ porque C ++ no es un superconjunto estricto de C y, por lo tanto, puede tomar la decisión sensata de hacerlos obligatorios.

Sin embargo, siempre debe declararlos: consulte esta pregunta. ¿Debe declarar el prototipo de función en C?

FYI en declaraciones de funciones C99 están ahora obligatorio.

Las declaraciones de funciones son obligatorias en C. Los prototipos, sin embargo, son opcionales, excepto en los casos de funciones variádicas y funciones cuyos tipos de argumentos serían alterados por promociones predeterminadas.

No puedo responder por C.

En C++, para funciones:

  • void foo(); es una declaración.
  • void foo() { .. } es una definición y una declaración.

Necesita al menos una declaración en el alcance antes de llamar foo().

Lo mismo es cierto para las variables de datos.

¿Ha sido útil esta solución?