2010-09-21 10 views
7

Mam przestrzeń nazw z funkcją inline, która będzie używana, jeśli kilka plików źródłowych. Podczas próby połączenia aplikacji funkcja inline jest zgłaszana jako duplikat symboli. Wygląda na to, że mój kod po prostu nie wstawiłby funkcji i zastanawiałem się, czy jest to oczekiwane zachowanie i jak najlepiej sobie z tym poradzić.Funkcja inline w przestrzeni nazw generuje zduplikowane symbole podczas łączenia w gcc

używam następujące opcje: gcc -g -Wextra -pedantic -Wmissing-field-inicjalizatory -Wredundant-decls -Wfloat równy -Wno-Reorder -Wno-długo-długo Ten sam styl kod wydaje się skompilować i połącz poprawnie podczas budowania w środowisku VC7.

Poniższy przykład kod przedstawia strukturę kodu:

/* header.h */ 
namespace myNamespace { 
inline bool myFunction() {return true;} 
} 

/* use_1.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 

/* use_2.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 
+1

Czy OK jest zmienną globalną w każdym pliku cpp? To spowodowałoby duplikowanie błędu symbolu. Zakładając, że nie jest globalny, Twój przykład to legalny C++. Spróbuj skompilować za pomocą opcji -Winline. Jakiej wersji gcc używasz? –

+1

Należy opublikować aktualną wiadomość kompilatora. Czy błąd występuje przy minimalnych plikach źródłowych (tylko wspomniane wiersze bez elementów sugerowanych przez ...)? –

+1

Po zmianie jednej z nazw opcji "OK" na "OK1", dodano pustą funkcję "main" i usunięto '...'; skompilowanie obu plików z dostarczonymi opcjami działa poprawnie. Musisz podać więcej szczegółów, ponieważ przyczyną błędu nie jest tutaj. –

Odpowiedz

-1

słowo kluczowe inline jest traktowane tylko jako wskazówka przez kompilator. Jeśli kompilator zdecyduje, że funkcja będzie lepiej działała bez wbudowanego, nie będzie jej inline. Istnieją słowa kluczowe specyficzne dla dostawcy, które powodują, że kompilator wbudowuje funkcję - jest to GCC i __attribute__((always_inline)) dla Visual C++.

Jeśli naprawdę chcesz się upewnić, że twoja funkcja nie będzie powodowała błędów linkera we wszystkich przypadkach na wszystkich standardowych kompilatorach, możesz chcieć zrobić szablon, ponieważ gwarantuje, że funkcje szablonów nie spowodują błędów linkera, nawet jeśli zostaną zdefiniowane w nagłówkach . Jest to jednak zupełnie niepotrzebne w przypadku naprawdę prostych funkcji.

+2

Twój kod nie powoduje błędów linkera, jeśli napisałeś go poprawnie. Pisanie szablonów tam, gdzie nie są potrzebne, jest nonsensem. –

+1

Nie ma znaczenia, czy kompilator C++ wstawia funkcję, czy nie. Kompilator obsługuje to przezroczyście w ramach reguły "jak gdyby". Niemniej jednak 'inline' wpływa na semantykę programu. Jest to tutaj odpowiednie bez względu na to, czy kompilator faktycznie wstawia tę funkcję. Proszę zbadać "zasadę jednej definicji". – sellibitze

+0

ROZWIĄZANIE: W końcu miałem czas, by wyśledzić problem do jego korzeni i (jak to często bywa) był to prosty problem z konsystencją przy użyciu prekompilowanych nagłówków. Dowiedziałem się, że użycie inline jest w rzeczywistości przejrzyste i nie wymaga dbania o to, czy kompilator rzeczywiście wbudowuje funkcję, czy nie. A co najważniejsze: zawsze używaj flagi -Winvalid-pch podczas używania prekompilowanych nagłówków. – doberkofler

Powiązane problemy