Prototypy funkcji
Deklaracja funkcji poprzedza definicji funkcji i określa nazwę, typ zwracany, klasy magazynowania i inne atrybuty funkcji.Być prototyp, deklarację funkcji musi również ustanowić typów i identyfikatorów dla argumentów funkcji.
Składnia
declaration:
Specyfikatory deklaracji atrybutu seq optinit; niewłaściwy deklarator listy opt**;**/ * seq atrybutu opt jest programu Microsoft * /
Specyfikatory deklaracji:
Specyfikator klasy magazynowania deklaracji Specyfikatory optDeklaracja Specyfikatory specyfikatora typu opt
Typ kwalifikatora deklaracji Specyfikatory opt
init; niewłaściwy deklarator listy:
niewłaściwy init deklaratorinit; niewłaściwy deklarator listy , ; niewłaściwy init deklarator
niewłaściwy init deklarator:
niewłaściwy deklaratorniewłaściwy deklarator = inicjatora
declarator:
wskaźnik opt*; niewłaściwy bezpośrednie deklarator*niewłaściwy bezpośrednie deklarator: / *; niewłaściwy funkcji deklarator * /
niewłaściwy bezpośrednie deklarator ( ) listy Typ parametru ) / * nowy styl; niewłaściwy deklarator * /niewłaściwy bezpośrednie deklarator ( ) Lista identyfikatorów opt**)** / * styl przestarzały; niewłaściwy deklarator * /
Prototyp ma tego samego formularza jako definicji funkcji, z wyjątkiem, że jest zakończone średnikiem, niezwłocznie po nawias zamykający i dlatego ma żaden organ.W każdym przypadku zwracany typ należy uzgodnić z zwracany typ określone w definicji funkcji.
Prototypy funkcji mają następujące ważne zastosowań:
Ustanawiają one typem zwracanym dla funkcji, które zwracają typów innych niż int.Chociaż funkcje zwracają int wartości nie wymagają prototypy, zaleca się prototypów.
Bez pełną prototypy konwersji standardowych są wykonane, ale nie są podejmowane próby w celu kontroli typu lub liczba argumentów z liczbą parametrów.
Prototypy są używane do inicjowania wskaźników do funkcji, zanim te funkcje są zdefiniowane.
Lista parametrów jest używana do sprawdzania zgodności argumentów wywołania funkcji z parametrami w definicji funkcji.
Przekonwertowane typ każdego parametru określa interpretacji argumenty, które wywołanie funkcji umieszcza na stosie.Niezgodność typów między argumentu, a parametr może spowodować argumenty na stosie, aby być błędnie zinterpretowana.Na przykład na komputerze z 16-bitowe, jeśli wskaźnik 16-bitowy jest przekazywana jako argument, następnie zgłoszone jako long parametr, pierwszy 32 bity na stosie są interpretowane jako long parametr.Błąd ten stwarza problemy nie tylko z long parametr, ale wszystkie parametry, które po nim następują.Błędy tego rodzaju może wykryć oświadczając prototypy funkcji kompletne dla wszystkich funkcji.
Prototyp ustanawia atrybuty funkcji tak, że wywołania funkcji, które należy poprzedzić jego definicji (lub wystąpić w innych plikach źródłowych) może zostać sprawdzona dla argumentu Typ i niezgodności typów return.Na przykład, jeśli zostanie określony statyczne Specyfikator klasy magazynowej w prototyp, należy także określić statyczne storage class w definicji funkcji.
Zakończenie deklaracji parametru (int a) mogą być mieszane z abstrakcyjna declarators (int) w tej samej deklaracji.Na przykład następująca deklaracja jest prawnych:
int add( int a, int );
Prototyp może zawierać typ i identyfikator dla każdego wyrażenia, który jest przekazywany jako argument.Jednakże takie identyfikatory mają zakres tylko do końca deklaracji.Prototyp można również odzwierciedla fakt, że liczba argumentów jest zmienna, lub że żadne argumenty są przekazywane.Bez listy niezgodności może nie może zostać ujawniona, aby kompilator nie może wygenerować informacji diagnostycznych dotyczących ich.Zobacz argumenty więcej informacji na temat sprawdzania typu.
Zakres prototyp kompilator Microsoft C jest teraz ze standardem ANSI, podczas kompilacji z opcją kompilatora /Za.Oznacza to, że przy deklarowaniu struct lub Unii znaczniku prototyp, znacznik jest wprowadzana w tym zakresie, zamiast w zakresie globalnym.Na przykład podczas kompilacji z /Za zgodności ANSI, nigdy nie może wywołać tę funkcję bez pobierania błąd niezgodności typu:
void func1( struct S * );
Aby poprawić swój kod, należy zdefiniować lub zadeklarować struct lub Unii w zakresie globalnym, przed prototyp funkcji:
struct S;
void func1( struct S * );
W obszarze /Ze tag nadal jest wprowadzana w zakresie globalnym.