[C++] Poprawne używanie kilku plików źródłowych


(Marcinch7) #1

Mój amatorski projekt zaczął rosnąć i się komplikować, więc postanowiłem rozdzielić go na kilka mniejszych plików z kodem źródłowym. Moje pytanie: czy robię to poprawnie, optymalnie i zgodnie ze standardami?

Plik .h includowany we wszystkich plikach .cpp

#ifndef HEAD_H

#define HEAD_H


#define _USE_MATH_DEFINES

#include 

#include 

#include 

#include 


using namespace std;


enum syf { N,R,G,B,Y,C,P };


extern typzmiennej zmienna1,zmienna2;


extern void funkcja1();

extern void funkcja2();


#endif

I przykładowy plik .cpp

#include "head.h"


typzmiennej zmienna1;


void funkcja1()

{

zmienna1=funkcja2();

}

Są tutaj jakieś błędy?


(Spam) #2

Są.

Niepotrzebnie dołączasz w pliku .h biblioteki, które nie będą potrzebne (potrzebne będą zapewne w odpowiadającym pliku .cpp). Poważnym błędem jest „using namespace” w pliku .h :wink:


(Marcinch7) #3

A z tymi externami to dobrze?


(Spam) #4

Nie ma sensu pisać ich przy deklaracji funkcji.


(Marcinch7) #5

Funkcji... A przy deklaracji zmiennych?


([alex]) #6

Nie uważasz że coś tu nie halo?

Dla zmiennych poprawnie, z tym że użycie zmiennych globalnych nie jest dobrym poczynaniem.

Bez problemu można je zastąpić na składowe statyczne jakieś klasy.


(Metka Shadowsong) #7

Jeżeli chcesz, żeby zmienne były globalnymi, dostępnymi w wielu plikach CPP to tak.

Extern oznacza, że zmienna jest deklarowana, a nie definiowana. Musisz ją potem zdefiniować w jednym z plików cpp bez słowa extern.

Poza tym powinieneś unikać umieszczania wszelkich #include w plikach 'h' i umieszcać je w plikach 'cpp'. Możesz umieścic #include w 'h', ale staraj się tego unikać.

Zauważ, że w pliku H nie potrzebujesz znać dokładnej definicji klasy 'klasa1', a jedynie zadeklarować, że taka istnieje. Dopiero w pliku cpp znajduje się odpowiedni #include

// plik H

class klasa1;


void jakasmetoda( klasa1*); // potrzebny jest wskaznik



//plik cpp


#include "klasa1" // tutaj jest definicja klasy 'kalasa1'

#include "plikH" // tutaj jest deklaracja metody


void jakasmetoda( klasa1 *obiekt)

{

implementacja

}