2012-03-02 11 views
5

Powiel możliwe:
Error: No previous prototype for function. Why am I getting this error?Brak poprzedniego prototypu?

Mam funkcji, że prototypy w pliku nagłówkowym, jednak Xcode wciąż daje mi ostrzeżenie No previous prototype for the function 'printBind'. Mam funkcję prototypowania setBind w taki sam sposób, ale nie dostaję ostrzeżenia o tej funkcji w mojej implementacji.

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

Odpowiedz

19

W C, to:

void printBind(); 

nie jest prototypem. Deklaruje funkcję, która niczego nie zwraca (void), ale przyjmuje nieokreśloną listę argumentów. (Jednak, że lista argumentów nie jest zmienna; wszystkie funkcje robienia listę argumentów o zmiennej długości musi mieć pełny prototyp w zakresie unikania niezdefiniowanej zachowanie.)

void printBind(void); 

To prototyp dla funkcji, która nie bierze argumenty.

Zasady w C++ są różne - pierwszy deklaruje funkcję bez argumentów i jest równoważny z drugim.

Powód różnicy jest historyczny (czytaj "pochodzi z połowy lat 80."). Po wprowadzeniu prototypów do C (kilka lat po dodaniu ich do C++), istniała ogromna spuścizna kodu, który zadeklarował funkcje bez listy argumentów (ponieważ nie było to możliwe przed dodaniem prototypów), więc rozważenia dotyczące zgodności wstecznej oznaczały że SomeType *SomeFunction(); musiał nadal oznaczać "funkcję, która zwraca SomeType *, ale dla której nic nie wiemy o liście argumentów". C++ ostatecznie dodał notację SomeType *SomeFunction(void); dla kompatybilności z C, ale nie był potrzebny, ponieważ połączenie typu bezpiecznie zostało dodane wcześnie i wszystkie funkcje wymagały prototypu w zakresie zanim zostały zdefiniowane lub użyte.

+0

Chociaż teraz rozumiem przyczynę błędu, tak naprawdę nie rozumiem użyteczności tej funkcji. Kiedy zdefiniowałbyś funkcję z nieokreśloną listą parametrów i co to dokładnie ma wspólnego z C++? Czy jest to przydatna funkcja w C++? – sherrellbc

+0

Nie można zdefiniować prototypu z nieokreśloną listą argumentów w C++. W języku C++ oznacza to "brak argumentów", a nie "nieokreślone argumenty". Ta funkcja nie jest tak przydatna, jak konieczne ustępstwo na rzecz rzeczywistości. Po standaryzacji C cała ogromna baza kodu została napisana bez prototypów; nie istniały w C. Pusta notacja w nawiasach była wszystkim, co było w pre-normie C. Aby wyegzekwować zakaz, zabiłoby to powstający standard C. Tak było nadal w przypadku C99. Dla C11 było to mniej jasne, ale pozostało niezmienione. –

Powiązane problemy