Dlaczego nie jest możliwe inline funkcji lub definicji funkcji członków klasy w plikach .CPP? Na przykład w moich przykładach testowych Poniżej linker da mi powrót niezdefiniowane referencje , jeśli spróbuję inline funkcję lub definicję członka klasy w pliku CPP:

test.h

void print();

class A
{
    public:
        void print() const;
};

test.cpp

#include <test.h>

inline void print()
{
    // implementation
}

inline void A::print() const
{
    // implementation
}

main.cpp

#include <test.h>

int main(int argc, char** argv)
{
    print(); // undefined reference to `print()'
    A a;
    a.print(); // undefined reference to `A::print() const'

    return 0;
}

Przeczytałem trochę Odpowiedzi tutaj, ale nadal jestem niepewny, jak to Pracuje.

0
AndreasLukas 3 czerwiec 2018, 14:17

3 odpowiedzi

Najlepsza odpowiedź

Słowo kluczowe inline jest naprawdę mylące, chociaż dla tego użycia jest nadal jasne, jeśli znasz znaczenie.

inline Wpływa na wymagania kodu, które należy wygenerować. Dokładniej mówi do kompilatora, że nie powinien przewidzieć wskaźnika funkcji dla tej funkcji. Jak zawsze może skopiować zawartość do rozmówcy. Z powodu inline, oryginalna funkcja nie musi być tworzona. Więc nie masz wskaźnika funkcji w test.o.

W Main.o, nazywasz tę funkcję. Dlatego próbuje rozwiązać wskaźnik funkcji, który nie został utworzony, co powoduje błąd łącznika.

Znalezienie tych przypadków można wykonać na przykład ostrzeżenie kompilatora przez Clang: {{x0 }}.

EDYTUJ

Czy funkcja inline nie ma wskaźnika funkcji? Nie, możesz doskonale podjąć adres tej funkcji i używać go i przekazać. Chociaż ze względu na charakter inline funkcji nie można polegać na tym wskaźniku funkcji porównującym równy w porównaniu z innym adresem tej samej funkcji.

W takim przypadku będziesz miał gdzieś wskaźnik funkcji w pliku obiektu. Jednak w tym przypadku kompilator nie wymaga nadania tej poprawnej nazwy zmęczonej, dzięki czemu może być używany z innego urządzenia kompilacyjnego.

2
JVApen 3 czerwiec 2018, 11:55

q) dlaczego nie jest możliwe inline definicji funkcji w pliku .CPP?

może funkcje inline w pliku cpp.

Nie można uzyskać dostępu do funkcji inline z różne cpp.

Funkcja Inline musi być obecna w każdy plik , który go używa. Dlatego często idą w plikach nagłówka, więc każde źródło wymagające go użyć, zawiera nagłówek zawierający go.

5
Galik 3 czerwiec 2018, 11:42

Z CPPReference.com:

Definicja funkcji inline lub zmiennej (od C ++ 17) musi być obecna w jednostce tłumaczeniowej, w której jest dostępny (niekoniecznie przed punktem dostępu).

Twoje funkcje są zdefiniowane w test.cpp, ale masz dostęp do nich z main.cpp.

1
Mikhail Vasilyev 3 czerwiec 2018, 11:48