Problem z kompilacją klas w wielu plikach
Ostatnio zmodyfikowano 2023-03-03 19:13
GrhuGhu Temat założony przez niniejszego użytkownika |
Problem z kompilacją klas w wielu plikach » 2023-03-03 18:42:04 Witam, mam 4 pliki GUI_Element.h: #ifndef GUI_Element #define GUI_Element
class GUI_Element { public: };
#endif
GUI_Element.cpp: GUI_titleBar.h #ifndef GUI_titleBar_h #define GUI_titleBar_h
#include "GUI_Element.h"
class GUI_titleBar : public GUI_Element { };
#endif oraz GUI_titleBar.cpp #include "GUI_titleBar.h"
Próbuje stworzyć prosty interfejs graficzny i chcę żeby każdy element interfejsu (Przyciski, suwaki itp.)dziedziczył po klasie GUI_Element. Problem w tym, że gdy próbuje skompilować kod kompilator wyrzuca błąd: Błąd C2059 błąd składniowy: „{” 7. Błąd wskazuje na klamre w klasie GUI_titlebar, gdy z pliku GUI_titleBar.cpp usunę linijkę "#include "GUI_titleBar.h"" program kompiluje się bez problemów. Dosyć dawno nie programowałem ale pamiętam, że miałem kiedyś podobny problem i było to coś związanego z dołączaniem bibliotek i plików ale nie jestem w stanie samemu dojść do tego w jaki sposób rozwiązać ten problem. |
|
tBane |
» 2023-03-03 18:49:51 Ja na twoim miejscu zdecydowałbym się w czym pisze. Jak masz *.cpp to nagłówki chyba powinny być *.hpp. Poza tym w pierwszym *.h nie ma rozszerzenia w define |
|
pekfos |
» 2023-03-03 18:50:01 Nazwa klasy GUI_Element koliduje z nazwą makra którego używasz jako include guard w tym pliku nagłówkowym. Dodaj _h na końcu jak w drugim pliku, a najlepiej pisz nazwy makr wielkimi literami. Taka jest typowa konwencja, właśnie po to by było trudniej o przypadkową kolizję. Ja na twoim miejscu zdecydowałbym się w czym pisze. Jak masz *.cpp to nagłówki chyba powinny być *.hpp. Bez znaczenia w przypadku nagłówków. A jak nie ma znaczenia to typowo się pisze .h, bo krócej. Takie rozszerzenie też zaleca C++ Core Guidelines. |
|
GrhuGhu Temat założony przez niniejszego użytkownika |
» 2023-03-03 19:00:12 Uczyłem się żeby używać plików *.cpp i *.h z resztą nawet środowisko tworzy domyślnie pliki z takimi rozszerzeniami gdy używam opcji Dodaj>Klasę. Problem rozwiązany dodanie "_h" w pliku GUI_Element podziałało. Jest jakaś różnica pomiędzy: a, #ifndef NAZWA_h #define NAZWA_h
#endif
? Bo wydaje mi się, że pełnią tą samą role więc może #pragma once# było by mniej problematyczne. |
|
pekfos |
» 2023-03-03 19:08:47 #pragma wykonuje niestandardową operację, więc jest ryzyko że kod nie będzie przenośny i na jakimś kompilatorze nie będzie się kompilować. #pragma once jest równoważne w działaniu do tradycyjnego include guard obejmującego cały plik, zakładając że nazwa użytego makra nie pojawia się nigdzie indziej. https://learn.microsoft.com/en-us/cpp/preprocessor/once?view=msvc-170 |
|
GrhuGhu Temat założony przez niniejszego użytkownika |
» 2023-03-03 19:13:54 Ok, dziękuje za odpowiedź. |
|
« 1 » |