[C++] - extern

0

Mam plik nagłowkowy main.h zawierający klasę , deklaruje obiekt tej klasy w pliku main.cpp.
Obiekt ma być zmienną globalną tak by inne pliki mogły z niego korzystać"

main.h

 
// Nagłowek zawierający klase 

#ifndef _MAIN_H_
#define _MAIN_H_

struct PERSON
{
     int            age;
     std::string name;
};

#endif 

// Drugi plik
main.cpp

 
PERSON Employ;

teraz chciałbym w innym pliku Dispaly.cpp go wyświetlic.

// trzeci plik
Dispaly.cpp


#include <main.h>;    // Dlaczego musze załączac nagłowek
extern  PERSON Employ;

void Show()
{
     std::cout<<age<<"\n";

}

Dlaczego muszę załączać nagłówek main.h w Display.cpp skoro extern wskazuje , że ta deklaracja nie jest fizyczna lecz jest zaimportowana z main.cpp ?

Czy dlatego , że jest to typ danej zdefiniowanej przeze mnie i jest ten typ zdefiniowany w main.h?

Pytam się , bo gdy zakomentuje ( //#include <main.h>;) linijkę #include <main.h>; to kompilator VC nie krzyczy, że PERSON Employ; jest niezadeklarowana, tylko krzyczy, że pominąłem znak ';' przed identyfikatorem Employ !

"erroro C2146: syntax error: missing ';' before identifier 'Emplo' "foo

dlaczego tak dziwny kominikat?

0

Tak, dla tego, gdyż typ zmiennej nie jest znany kompilatorowi. Scaleniem tych plików zajmuje się linker, który o typach zmiennych nie ma zielonego pojęcia.

0

To jest niedoróbka kompilatora. Błąd powinien mówić o nieznanym typie PERSON. Jak widzisz, nie zawsze treść błędu wskazuje dokładnie na sedno problemu, czasami kompilator się gubi. Częściowo dlatego, że trudno określić co programista miał naprawdę na myśli pisząc błędny kod: jedyne co wiadomo z pewnością to to, że jest błędny.

U mnie VC++ 2008 wywala:

a.cpp(1) : error C2146: syntax error : missing ';' before identifier 'Employ'
a.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Ale GCC wyrzuca tak:
a.cpp:1:9: error: 'PERSON' does not name a typeco już ma więcej sensu.

Watcom pisze tak:

a.cpp(1): Error! E336: col(22) declaration specifiers are required to declare 'PERSON'
a.cpp(1): Error! E006: col(16) syntax error; probable cause: missing ';'

Jak widać, GCC wypisuje o braku typu PERSON. VC++ gubi się na „brakującym” średniku, uważając PERSON za nazwę zmiennej z brakującymi nazwą typu i średnikiem, do słowa „Employ” nawet nie dochodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1