2011-12-13 14 views
12

Para mí, estos términos son esencialmente sinónimos cuando se utiliza el lenguaje de programación C. En la práctica, es posible que prefiera la "declaración directa" para los prototipos dentro del archivo frente al "prototipo de función" para los prototipos incluidos a través de un archivo de encabezado. Pero incluso eso es una distinción artificial cuando se considera lo que sucede después del preprocesamiento. Quizás me estoy perdiendo algo.Terminología: declaración directa frente a prototipo de función

¿Existe un consenso sobre cuándo usar un término frente al otro?

Respuesta

6

IMO esos no son realmente sinónimos. Para mí, "prototipo de función", consulte el nombre de la función y sus parámetros 'y los tipos de retorno. No se aplica solo a lo que usted llama "declaración directa". Todas las funciones tienen un prototipo.

Más a menudo hacemos una diferencia entre una declaración de función y su correspondiente definición.

+1

+1, aunque es muy común el uso de la palabra "prototipo" para referirse a la declaración . –

+0

Creo que tú y @MatteoItalia lo han resumido. He estado usando el término prototipo cuando debería usar el término declaración. –

4

Utilizo el término declaración directa para el siguiente tipo de declaración struct con una definición.

struct Foo; 

Una declaración de la función no tiene por qué ser un prototipo completo, para la compatibilidad con pre-1989 (K & R) C

char *foo(); // NOT the same as char *foo(void) 
0

El único concepto en C Estoy en cuenta es la distinción entre la declaración y la definición. Un prototipo es una declaración y puede ocurrir en cualquier lugar, en cualquier momento y la definición que es la implementación real del objeto dado. según ese concepto, no hay nada que se llame declaración anticipada, sino solo una orden de declaración.

-1

No sé si hay un consenso, pero creo que la forma más limpia de hacerlo sería:

  • Coloque todas las declaraciones en los archivos de cabecera, nunca en la fuente o archivos .c. (Creo que te refieres cuando dices declaración declaración adelantada.)
  • Place todas las definiciones en los archivos de origen

no me gustan para colocar las declaraciones en los archivos, ya que puede tener declaraciones contradictorias y sin errores en C, la cual puede causar violaciones de segmento, por ejemplo: si tiene ac

int foo(char *str_one, char *str_two, char *str_three); 

y BC tiene

int foo(char *str_one, char *str_two); 

no obtendrá advertencias ni errores, y las llamadas realizadas a foo() desde b.c no colocarán todos los parámetros en la pila donde deberían estar, lo que significa que foo() solo tomará algo de la pila y lo tratará como str_three, lo que posiblemente conduzca a una segfault. Entonces, para mí, las declaraciones van a los archivos de encabezado y las definiciones van a los archivos de origen.

+2

Las declaraciones para las funciones 'estáticas' deben colocarse en el archivo C que están definidas en el archivo iho, preferiblemente al principio. –

+0

@tristopia - buen punto, no estaba pensando en funciones estáticas cuando llegué a mi tribuna allí. Definitivamente no declararía esos en un archivo de encabezado. – dbeer

6

El término "prototipo" se refiere a una sintaxis de declaración específica; específicamente, que el número y los tipos de parámetros para la función aparecen en la declaración.Teniendo en cuenta una definición de función de

int foo(int a, char *b) {...} 

puede tener cualquiera de los siguientes declaraciones:

int foo();    // a declaration, but not a prototype 
int foo(a, b);   // a declaration, but not a prototype 
int foo(int, char *);  // a declaration and a prototype 
int foo(int a, char *b); // a declaration and a prototype 
+0

Su opción 'int foo (a, b);' solo es válida si 'a' y' b' son nombres de tipos conocidos, o si está seguido por el cuerpo de la función '{...}' en lugar de un punto y coma. –

Cuestiones relacionadas