2012-03-02 16 views
5

Eventuali duplicati:
Error: No previous prototype for function. Why am I getting this error?Nessun prototipo precedente?

Ho una funzione che ho prototipo nel file di intestazione, tuttavia Xcode dà ancora mi avvertimento No previous prototype for the function 'printBind'. Ho la funzione setBind prototipata nello stesso modo ma non ricevo un avviso per questa funzione nella mia implementazione.

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); 
} 

risposta

19

In C, questo:

void printBind(); 

non è un prototipo. Dichiara una funzione che non restituisce nulla (void) ma prende un elenco indeterminato di argomenti. (Tuttavia, tale elenco di argomenti non è variabile; tutte le funzioni che assumono un elenco di argomenti di lunghezza variabile devono avere un prototipo completo di portata per evitare un comportamento indefinito.)

void printBind(void); 

Questo è un prototipo per la funzione che non tiene argomenti.

Le regole in C++ sono diverse: la prima dichiara una funzione senza argomenti ed è equivalente alla seconda.

Il motivo della differenza è storico (leggi 'risale alla metà degli anni '80'). Quando i prototipi sono stati introdotti in C (alcuni anni dopo sono stati aggiunti a C++), esisteva un'enorme eredità di codice che dichiarava funzioni senza elenco di argomenti (perché non era un'opzione prima che i prototipi venissero aggiunti), quindi le considerazioni sulla compatibilità all'indietro significavano che SomeType *SomeFunction(); doveva continuare a significare 'una funzione che restituisce un valore SomeType * ma per il quale non sappiamo nulla dell'elenco degli argomenti'. C++ alla fine ha aggiunto la notazione SomeType *SomeFunction(void); per la compatibilità con C, ma non ne ha avuto bisogno poiché il collegamento di tipo sicuro è stato aggiunto in anticipo e tutte le funzioni necessitavano di un prototipo in ambito prima che fossero definite o utilizzate.

+0

Anche se ora capisco il motivo dell'errore, non capisco l'utilità di questa funzione. Quando definiresti una funzione con un elenco di parametri indeterminato e cosa ha a che fare esattamente ciò con C++? È una funzionalità utile in C++? – sherrellbc

+0

Non è possibile definire un prototipo con un elenco di argomenti indeterminato in C++. In C++, ciò significa "senza argomenti", non "argomenti indeterminati". La funzione non è tanto utile quanto una concessione necessaria alla realtà. Quando C fu standardizzato, l'intera vasta base di codice fu scritta senza prototipi; non erano esistiti in C. La notazione della parentesi vuota era tutto ciò che c'era in pre-standard C. Per essere dichiarato fuori legge avrebbe ucciso lo standard C nascente. Questo era ancora vero per C99. Era meno chiaro per C11, ma è rimasto invariato. –