DevCpp - kilka plików w projekcie


(Pixxel Man) #1

Mam w projekcie jeden plik .h i kilka .cpp. W .h deklaracje zmiennych i metod, w jednym .cpp np. main.cpp opisane ważniejsze metody i dołączony plik head.h. Do każdego pliku .cpp dołączam plik head.h. No i kompiluje. W debugerze są komunikaty:

multiple definition of 'nazwa_zmiennej'

first defined here

I taki komunikat do każdej zmiennej.

Jak podołączać te pliki "head.h" i\lub "main.cpp" żeby kod się skompilował bez błędów?


(Ryan) #2

Po pierwsze komunikaty nie pojawiają się w debuggerze tylko w logach z kompilacji. Po drugie ciężko mi zgadywać co źle zrobiłeś jeśli nie widzę plików. A zrobić źle mogłeś wiele rzeczy. Masz jednokrotnie załączany plik nagłówkowy?

#ifndef __JAKIS_UNIKALNY_IDENTYFIKATOR

#define __JAKIS_UNIKALNY_IDENTYFIKATOR

//tresć pliku nagłówkowego

#endif

(Pixxel Man) #3

Kod jest dobry bo jak kompilowałem go w jednym pliku .cpp to wszystko było dobrze. Trochę się wydłużał więc chciałem go podzielić. No i do każdego .cpp jest dołączony #include "head.h".

Dopisywałem to co poradziłeś, ale niestety dalej to samo :frowning:


(Ryan) #4

Wklej proszę ten plik nagłówkowy. I taka uwaga, bo pewnie to właśnie zrobiłeś: w plikach nagłówkowych _raczej_ nie umieszcza się kodu (jedynie makra i prototypy funkcji).


(Pixxel Man) #5

Zamieszczę fragment kodu żeby nie zapychać miejsca:

#ifndef HEAD_H

#define HEAD_H

#include 

#include 

#include 

#include 

#include 

#include 

#define PI 3.14

using namespace std;


string choice; // choice in options

unsigned short int menu; //number of actual menu

unsigned short int _clearScreen;

unsigned short int _horizontalLine;

double a;

double b;

double c;


(...)


void MainMenu();

void ClearScreen(); // clear the screen and show intro - czyszczenie ekranu i pokazywanie intro


(...)

void Figures_Circle(); // kolo


#endif

Wszystkie pliki projektu:

8cffb38b9fe4c797.jpg


(Ryan) #6

Kilka uwag, może pomogą.

  1. oddziel nagłówek standardowy (ten, który z include ogólnych nagłówków) od nagłówka z Twoimi rzeczami.

  2. używaj słówka extern dla zmiennych a same zmienne zadeklaruj w plikach z kodem, np.

  1. nie używaj zmiennych globalnych - to zło. Jesli potrzebujesz coś globalnie wyeksponować, zrób to jak w "przykładzie" powyżej opakowując zmienną w funkcje get/set:

Generalnie chodzi o to, że nie masz kontroli nad tym kto i kiedy zmienia wartość zmiennej globalnej. W jednowątkowym programie to niewielki problem (choć trudno do zdebuggowania) w wielowątkowym to koszmar. 4. Spróbuj wypiąć head.h z projektu (nie pamiętam jak z nagłównowymi plikami radzi sobie DevCpp). Jeśli to poprawi sytuację - pogrzeb czy nie da się w ramach projektu plików lub katalogów oznaczyć jako część projektu, której się nie kompiluje. 5. Jeśli używasz ifndef/define/endif staraj się użyć czegoś bardziej nietypowego niż HEAD_H, np. __MOJ_PROJEKT_PLIK_H_ - jest pewna szansa, że HEAD_H już istnieje (choć to nie jest związane z Twoim problemem, sugeruję tak na przyszłość). 6. Przesiądź się na Visual Studio C++ Express - zarządzanie projektem jest wygodniejsza, poza tym zamiast ifndef/define/endif możej użyć:

Efekt ten sam. :slight_smile: