2012-04-13 25 views
9

Właśnie przeglądałem pliki źródłowe gcc. W gcc.c, znalazłem coś takiegoDeklaracja zewnętrzna i definicja funkcji zarówno w tym samym pliku

extern int main (int, char **); 

int 
main (int argc, char **argv) 
{ 

Teraz moja wątpliwość jest extern jest poinformować kompilator, że dana funkcja nie jest w tym pliku, ale będzie można znaleźć gdzie indziej w projekcie. Ale tutaj definicja main jest bezpośrednio po deklaracji extern. Do czego służy deklaracja extern?

Wydaje się, że w tym konkretnym przykładzie, extern wydaje się zachowywać jak export że używamy w zespole Wherin eksportujemy konkretnego symbolu poza modułem

Jakieś pomysły?

Odpowiedz

13

Jesteś niezrozumienia extern - robi nie poinformować kompilator definicja jest w innego pliku, po prostu stwierdza, że ​​istnieje bez definiowania go. Można go zdefiniować w pliku z tym samym.

C ma pojęcie deklaracji (deklarując, że coś istnieje bez jej definiowania) i definicji (faktycznie ją wprowadzającej). Możesz zadeklarować coś tak często, jak chcesz, ale można go zdefiniować tylko raz.

Ponieważ funkcje mają powiązanie zewnętrzne domyślnie, słowo kluczowe extern nie ma w tym przypadku znaczenia.

0

Ostrzeżenia prawdopodobnie sugerowały brak prototypu funkcji. To wszystko.

6

Funkcje są niejawnie zewnętrzne w C. W tym extern jest tylko wizualnym przypomnieniem. Uwaga boczna, aby funkcja nie była zewnętrzna, można użyć słowa kluczowego static.

+0

Yup. Użyj zewnętrznego, robiąc coś niestandardowego. – Barry

0

Definicja funkcji main:

int main(int argc, char **argv) { ... } 

już zgłoszenie jest składnia prototypowe funkcji main z zewnętrznym łącznikiem. Oznacza to, że prototypowa deklaracja z extern tuż przed definicją main jest zbędna.

2

W deklaracji funkcji, extern po prostu deklaruje, że funkcja ma połączenie zewnętrzne, które jest domyślne; Słowo kluczowe extern jest całkowicie bezużyteczne w tym kontekście, a efekt jest identyczny z normalną deklaracją/prototypem bez słowa kluczowego extern.