Quentin1 utworzono 16 lutego 2009 utworzono 16 lutego 2009 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 17 lutego 2009 komentarz 17 lutego 2009 Usuń #include "X.h" z obu plików cpp. Skoro dołączasz go już w B.h, nie ma to sensu.
Quentin1 komentarz 17 lutego 2009 Autor komentarz 17 lutego 2009 (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 17 lutego 2009 komentarz 17 lutego 2009 (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.