2012-10-11 33 views
23

Czy ktoś może mi powiedzieć, jaka jest różnica między funkcją inline a statyczną funkcją inline?Różnica między funkcją inline i statyczną funkcją inline

W jakich przypadkach wolałbym wstawiać statycznie w linii?

Zadaję to pytanie, ponieważ mam funkcję inline, dla których mam problemy kompilacji podczas łączenia (relocation error:... symbol has been discarded with discarded section ...). Zrobiłem to normalną funkcją i zadziałało. Teraz niektórzy z moich seniorów powiedzieli, że próbuję z wbudowanym statycznym. Poniżej jest mój funkcji:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1) 
{ 
    wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name); 
    notifier->notify (arg, aspect); 
} 

a nie wewnątrz klasy. To jest w pliku nagłówkowym!

Przypuszczam, że wywołanie funkcji statycznej powinno być wykonywane tylko w określonej JT, gdzie jest ona zdefiniowana.

Ponieważ moja funkcja znajduje się w pliku nagłówkowym, a jeśli sprawię, że będzie statyczna, to czy kiedykolwiek uwzględnię ten plik nagłówkowy, czy funkcja statyczna może być użyta w tej jednostce tłumaczeniowej?

+0

Czy ta funkcja jest dostępna w klasie? Proszę również zamieścić swoją deklarację. – anatolyg

+1

to ':: wizNtrKit' jest statycznym obiektem? jaki jest jego związek? – Walter

+0

Ponadto, gdzie pojawia się funkcja? Plik nagłówka, plik źródłowy? Ile zawiera plików źródłowych? –

Odpowiedz

36

Niestatyczna deklaracja funkcji inline odnosi się do tej samej funkcji w każdej jednostce tłumaczeniowej (pliku źródłowym), która z niej korzysta.

Reguła jednej definicji wymaga, aby treść definicji funkcji była identyczna w każdej JT, która ją zawiera, z długą definicją "identyczności". Zwykle jest to satysfakcjonujące, pod warunkiem, że wszystkie pliki źródłowe używają tego samego nagłówka i pod warunkiem, że funkcja nie używa żadnych globalnych nazw z wewnętrznym powiązaniem (w tym funkcji static) lub jakichkolwiek makr, które są zdefiniowane inaczej w różnych JT.

Nie pamiętam, aby spotkać się z tym konkretnym błędem linkera, ale jest przynajmniej możliwe, że jedno z tych ograniczeń jest odpowiedzialne. Twoim obowiązkiem jest spełnienie wymagań: niezdefiniowane zachowanie bez diagnostyki, jeśli tego nie zrobisz.

Deklaracja funkcji static inline odnosi się do innej funkcji w każdej jednostce tłumaczeniowej, która akurat ma taką samą nazwę. Może używać globalnych nazw lub makr static, które różnią się w różnych JT, w takim przypadku funkcja może zachowywać się inaczej w różnych JT, nawet jeśli jej definicja w pliku nagłówkowym "wygląda tak samo".

Z powodu tej różnicy, jeśli funkcja zawiera jakiekolwiek zmienne lokalne static, zachowuje się ona inaczej w zależności od tego, czy jest to static czy nie. Jeśli jest to static, to każda JT ma swoją własną wersję funkcji, a więc własną kopię zmiennych lokalnych static. Jeśli jest to tylko inline, istnieje tylko jedna kopia zmiennych lokalnych static używanych przez wszystkie jednostki tłumaczeniowe.

+2

Uwaga: w przypadku funkcji 'statycznych', bit' inline' traci swoje znaczenie semantyczne (* w porządku, jeśli definicja tej funkcji pojawia się w wielu JT *); jedyną rzeczą, która pozostaje przywiązana do 'inline' jest jedynie wskazówka dla kompilatora, która prawie prawie ignoruje. –

+0

Tak, to, co powiem o funkcji 'inline', byłoby również prawdziwe w przypadku deklaracji funkcji, które nie są ani" statyczne "ani" wbudowane ", z wyjątkiem wymogu zasady jednej definicji.Zamiast wymagać identycznych definicji w każdej JT, wymagałoby to, aby tylko jedna TU zawierała definicję. Biorąc pod uwagę, że kod pytającego działa po usunięciu 'inline' podejrzewam, że dzieje się tu coś śmiesznego - można się spodziewać błędu linkera, jeśli jest zdefiniowany w wielu JT. Nie sądzę, że diagnostyka jest wymagana, ale nie jest trudna dla linkera. –

Powiązane problemy