[C++] Linkowanie wewnętrzne i zewnętrzne


(Quentin) #1

Witam!

Mam pytania odnośnie linkowania wewnętrznego i zewnętrznego.

Linkowanie wewnętrzne powoduje, że niektóre zmienne nie są znane w całym programie (nawet pomimo danych deklaracji), tylko ograniczają się do jednego pliku. I jakie obiekty poddawane są takiemu linkowaniu :?: Wyszukałem, że to m.in.:

1) Globalne obiekty statyczne,

2) Nazwy typów utworzone za pomocą typedef,

3) Funkcje składowe klas inline, oraz zwykłe funkcje inline,

4) Globalne obiekty z nienazwanej przestrzeni nazw,

5) Typy wyliczeniowe enum,

6) Globalne obiekty stałe (const) - o ile nie są zadeklarowane jako extern,

7) Nazwy klas nie użytych w deklaracjach obiektów.

I odnośnie tego są trzy sprawy:

A) O co chodzi z punktem 6) :?: Zdefiniowałem dwie stałe w różnych plikach - OK, nie ma konfliktu. Potem z jednego pliku wyrzuciłem definicję, a wstawiłem deklarację i próbowałem w funkcji main() wyświetlić zawartość tej stałej, to nastąpił błąd linkera. Więc po co ktoś napisał "o ile nie są zadeklarowane jako extern" :?: Wychodzi, że deklaracja unicestwia Internal Linkage - a tak nie jest...

B) Dlaczego stałość musi wymuszać linkowanie wewnętrzne - były ku temu jakieś powody :?:

C) O co chodzi z punktem 7) bo wcale go nie rozumiem...

Natomiast linkowanie zewnętrzne powoduje, że obiekty będą znane w całym programie, jeżeli umieścimy w odpowiednich miejscach określone deklaracje. Obiekty te to:

1) Definicje zmiennych

2) Definicje funkcji i funkcji składowych outline

3) Funkcje statyczne składowe

4) Deklaracje

I ostatnie pytanie:

D) Dodalibyście jeszcze coś do linkowania wewnętrznego lub zewnętrznego :?:


([alex]) #2

A. Jak w pliku .CPP napisano const int Zmienna=3; to wszystkie odwołania do niej w tym pliku będą przez linkowanie wewnętrzne.

B. Wszystkie globalne obiekty (oprócz zadeklarowanych jako extern) linkowane wewnętrznie. Z tym że w tych podanych przez ciebie regułach to rozbite na 3 punkty, co wprowadza nieporozumienia.

C. Ten punkt 7 nie jest do końca poprawny, jak nie masz obiektu - nie masz linkowania, bo niema co linkować.

D. Poco tak komplikować sobie życie. Wyjaśnienie jest proste: jeżeli coś da się załatwić linkowaniem wewnętrznym to tak się właśnie załatwia, jak się nie da to wtedy dopiero używa się zewnętrznego. Bardzo prosta zasada, obejmująca wszystkie 7 punktów a nawet więcej.