x-kom hosting

[C++] Błąd spowodowany wieloma definicjami

Quentin1
utworzono
utworzono

Witam!

Napisałem taki oto program:

Plik A.h:

extern int x;

Plik B.h:

extern int i;#include "X.h"

Plik X.h:

#ifndef NAGLOWEK_X#define NAGLOWEK_X	void funkcja1();	void funkcja2()	{		cout << "!UWAGA!\t Jestem w 'funkcja2'\t !UWAGA!\n\n";	}#endif

Plik 1_plik.cpp:

#include <iostream>using namespace std;#include "A.h" #include "B.h" #include "X.h"/* czyli:extern int x;--------------------------------extern int i;#include "X.h"{#ifndef NAGLOWEK_X#define NAGLOWEK_X	void funkcja1();	void funkcja2()	{		cout << "!UWAGA!\t Jestem w 'funkcja2'\t !UWAGA!\n\n";	}#endif}--------------------------------#ifndef NAGLOWEK_X#define NAGLOWEK_X	void funkcja1();	void funkcja2()	{		cout << "!UWAGA!tt Jestem w 'funkcja2'\t !UWAGA!\n\n";	}#endif */int x = 12;int i = 24;int main(){cout << "Jestem w 'main'\n\n";cout << "----------------------------\n\n";funkcja1();cout << "----------------------------\n\n";cout << "Z powrotem w 'main'";cout << "\n\n\n\n\n\n---------------------------------------------------------------\n";system("pause");}

Plik 2_plik.cpp:

#include <iostream>using namespace std;#include "A.h" #include "B.h" #include "X.h"void funkcja1(){	cout << "Jestem w 'funkcja1'\n"		 << "\tx = " << x << "\n"		 << "\ti = " << i << "\n\n";	funkcja2();	cout << "\n\n";}

Przy kompilacji wyświetla się następujący błąd:

fatal error LNK1169: one or more multiply defined symbols found

Dlaczego tak się dzieje ? Oczywiście po wywaleniu z programu funkcji2 wszystko jest OK. Ale przecież zastosowałem ten "trik" z #ifndef - co w nim nie tak ? Te 3 pliki nagłówkowe po wsadzeniu wyglądają przecież tak jak pokazałem to w komentarzu do 1-szego programu... Jeżeli znowu się wsadzi X.h to definicja się już nie wykona...

Z góry wielkie dzięki za pomoc :)

rafalluz
komentarz
komentarz

Usuń

#include "X.h"

z obu plików cpp. Skoro dołączasz go już w B.h, nie ma to sensu.

Quentin1
komentarz
komentarz (edytowane)

Nie domyśliłbym się sam.....

Dlaczego tak się dzieje ? Oczywiście po wywaleniu z programu funkcji2 wszystko jest OK.

A co za tym idzie działa też po wywaleniu include x.h

A żeby jeszcze bardziej wyróżnić to o co mi chodzi to może zwiększę czcionkę :)

Ale przecież zastosowałem ten "trik" z #ifndef - co w nim nie tak ?
rafalluz
komentarz
komentarz (edytowane)

Inaczej.

W pliku 2_plik.cpp ma być tylko (z include'ów):

#include <iostream>using namespace std;#include "A.h"#include "B.h"

W pliku 1_plik.cpp ma być tylko:

#include "2_plik.cpp"#include <cstdlib>

Tak działa (zweryfikowane pod g++, oczywiście wchodzi w obie funkcje), choć zapewne wyobrażałeś to sobie inaczej (pewnie to jakieś zadanko i są narzucone jeszcze jakieś ograniczenia).

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.