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?
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?
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
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).
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
oddziel nagłówek standardowy (ten, który z include ogólnych nagłówków) od nagłówka z Twoimi rzeczami.
używaj słówka extern dla zmiennych a same zmienne zadeklaruj w plikach z kodem, np.
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ć: