2012-03-02 14 views
5

Duplicar posible:
Error: No previous prototype for function. Why am I getting this error?¿Ningún prototipo anterior?

que tiene una función que un prototipo en el archivo de cabecera, sin embargo Xcode todavía da advirtiéndome No previous prototype for the function 'printBind'. Tengo la función setBind prototipada de la misma manera pero no recibo una advertencia para esta función en mi implementación.

CelGL.h

#ifndef Under_Siege_CelGL_h 
#define Under_Siege_CelGL_h 

void setBind(int input); 
void printBind(); 

#endif 

CelGL.c

#include <stdio.h> 
#include "CelGL.h" 

int bind; 

void setBind(int bindin) { // No warning here? 
    bind = bindin; 
} 

void printBind() { // Warning here 
    printf("%i", bind); 
} 

Respuesta

19

En C, esto:

void printBind(); 

no es un prototipo. Declara una función que no devuelve nada (void) pero toma una lista indeterminada de argumentos. (Sin embargo, esa lista de argumentos no es variable; todas las funciones que toman una lista de argumentos de longitud variable deben tener un prototipo completo en su alcance para evitar un comportamiento indefinido.)

void printBind(void); 

Eso es un prototipo de la función que no toma en argumentos.

Las reglas en C++ son diferentes: la primera declara una función sin argumentos y es equivalente a la segunda.

La razón de la diferencia es histórica (leer 'data de mediados de la década de 1980'). Cuando se introdujeron prototipos en C (algunos años después de que se agregaron a C++), hubo un enorme legado de código que declaró funciones sin lista de argumentos (porque esa no era una opción antes de agregar prototipos), por lo que las consideraciones de compatibilidad con versiones anteriores que SomeType *SomeFunction(); tenía que continuar significando 'una función que devuelve SomeType * pero de la que no sabemos nada sobre la lista de argumentos'. C++ finalmente agregó la notación SomeType *SomeFunction(void); para compatibilidad con C, pero no la necesitó ya que el enlace tipo seguro se agregó temprano y todas las funciones necesitaban un prototipo en el alcance antes de que se definieran o usaran.

+0

Aunque ahora entiendo el motivo del error, realmente no entiendo la utilidad de esta característica. ¿Cuándo definirías una función con una lista de parámetros indeterminados y qué tiene que ver exactamente con C++? ¿Es esta una característica útil en C++? – sherrellbc

+0

No se puede definir un prototipo con una lista de argumentos indeterminados en C++. En C++, eso significa "sin argumentos", no "argumentos indeterminados". La característica no es tanto útil como una concesión necesaria a la realidad. Cuando C se estandarizó, toda la vasta base de códigos se escribió sin prototipos; no habían existido en C. La notación de paréntesis vacía era todo lo que había en el preestablecimiento C. Haber proscrito habría matado al naciente estándar C. Eso seguía siendo cierto para C99. Fue menos claro para C11, pero no se modificó. –