2013-07-06 19 views
10

Co się stanie, jeśli moje zdefiniować funkcję w moim pliku .h jakCo dzieje się z zewnętrzną funkcją inline?

extern int returnaint(void); 

, zdefiniować go w odpowiednim pliku .c jak

inline int returnaint(void) { 
    return 1; 
} 

i zawierać nagłówek w innym pliku .c i użytkowania funkcja? Kiedy kompiluję rzeczy osobno, tworząc plik obiektowy dla każdego pliku .c, a następnie łącząc je, włącza się funkcję podkreśloną lub co się dzieje?

Wiem, że kompilator może zignorować inline, ale co jeśli go nie zignoruje w tym przypadku?

+2

Następnie pojawi się błąd linkera. –

+2

@ H2CO3, nigdy nie będzie błędu linkera. Jednostka kompilująca z definicją 'inline' również widzi deklarację' extern', więc symbol musi być emitowany. Proszę zobaczyć moją odpowiedź. –

+0

@JensGustedt Dzięki, wznowione. –

Odpowiedz

20

Po dodaniu inline do definicji funkcji w pliku .c jest po prostu zbędne.

  • Urządzenie kompilacja pliku .c widzi deklarację extern (bez inline) oraz inline definicji. W ten sposób emituje symbol funkcji w pliku obiektowym.

  • Wszystkie inne jednostki kompilacji zobaczyć tylko deklarację extern, a więc mogą one korzystać z funkcji bez problemów, jeśli odwołuje się do ostatecznego pliku wykonywalnego z drugiej .o pliku.

W rzeczywistości po prostu źle to rozumiesz. Ta funkcja ma być używana, abyś miał zdefiniowaną inline definicję w pliku , widoczną dla wszystkich. Ta definicja funkcji działa tylko jako deklaracja symbolu, podobnie jak extern, ale nie definiuje go.

Deklaracja extern w jednym pliku .c (jednostka kompilacji) zapewnia, że ​​symbol jest tam zdefiniowany.

terminologia jest nieco mylące, inlinedefinicja działającego w charakterze deklaracji symbolu, a externdeklaracja działając jako definicji niej

+1

Niezły punkt. Myślę, że powinienem przenieść moje funkcje inline do nagłówka! :-) – musicmatze

+0

Dodanie wstawki w jednostce tłumaczeniowej, która definiuje funkcję, ma wpływ. Prawdopodobnym rezultatem jest to, że zwiastuny tej funkcji w tej jednostce kompilacji będą zaznaczone. –

+0

@ UweKleine-König, no. Kompilator może wykonywać dowolne czynności. Jeśli definicja funkcji jest widoczna, kompilator może lub nie może wybrać inline, pod warunkiem, że przestrzega zasady "jak gdyby". Nic się nie zmienia, dodając do definicji 'inline'. –

4

Nie będzie się kompilować. Z C11 (ISO/IEC 9899: 2011) §6.7.4 SPECYFIKATORY funkcyjne (podkreślenie dodane):

Każda funkcja z wewnętrznym wiązaniem może być funkcja inline. W przypadku funkcji z zewnętrznym łączem obowiązują następujące ograniczenia: Jeśli funkcja jest zadeklarowana za pomocą wbudowanego specyfikatora funkcji, to należy ją również zdefiniować w tej samej jednostce tłumaczeniowej. Jeśli wszystkie deklaracje zakresu pliku dla funkcji w jednostce tłumaczeniowej zawierają wbudowaną specyfikację bez danych wyjściowych, definicja w tej jednostce tłumaczeniowej jest wewnętrzną definicją . Definicja wstawiona nie zapewnia zewnętrznej definicji funkcji, nie zabrania zewnętrznej definicji w innej jednostce tłumaczeniowej. Inline definition stanowi alternatywę dla zewnętrznej definicji, którą tłumacz może wykorzystać do wykonania dowolnego wywołania funkcji w tej samej jednostce tłumaczeniowej. Nie jest określone, czy wywołanie funkcji korzysta z definicji wbudowanej lub definicji zewnętrznej. 140)

140) Ponieważ z definicji inline różni się od odpowiadającej definicji zewnętrznej i od innych definicjami inline inne jednostki translacji, wszystkie odpowiednie obiekty ze statycznymi przechowywania trwania różnią się ponadto każdy z definicje.

Drugi .c plik pobiera jedynie deklarację funkcji inline z nagłówka, ale nie definicji, więc jest to niezgodne z zasadą pogrubioną czcionką.

EDIT:

Jako @Jens Gustedt wskazuje mój poprzedni wyjaśnienie jest błędne, ponieważ w pytaniu OP, funkcja jest zadeklarowana jako non-inline w pliku nagłówka:

extern int returnaint(void); 

Tak więc inny plik .c potraktuje go jak zwykłą funkcję.

+8

zła odpowiedź. inne pliki '.c' nie widzą' inline' deklaracja w '.h' ma tylko' extern', a nie 'inline'. –

Powiązane problemy