Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z kompilacją klas w wielu plikach

Ostatnio zmodyfikowano 2023-03-03 19:13
Autor Wiadomość
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:
C/C++
#ifndef GUI_Element
#define GUI_Element

class GUI_Element
{
public:
   
};

#endif

GUI_Element.cpp:
C/C++
#include "GUI_Element.h"

GUI_titleBar.h
C/C++
#ifndef GUI_titleBar_h
#define GUI_titleBar_h

#include "GUI_Element.h"

class GUI_titleBar
    : public GUI_Element
{
   
}
;

#endif  // !GUI_titleBar_h

oraz GUI_titleBar.cpp
C/C++
#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.

P-180016
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
P-180017
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.
P-180018
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:
C/C++
#pragma once

a,

C/C++
#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.

P-180019
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
P-180020
GrhuGhu
Temat założony przez niniejszego użytkownika
» 2023-03-03 19:13:54
Ok, dziękuje za odpowiedź.
P-180021
« 1 »
  Strona 1 z 1