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

Kolejnosc kompilacji - kompilator sie uparl!

Ostatnio zmodyfikowano 2012-12-22 12:27
Autor Wiadomość
berkov
Temat założony przez niniejszego użytkownika
Kolejnosc kompilacji - kompilator sie uparl!
» 2012-12-22 10:15:54
Hey ho!..

albo to mnie zacmilo albo kompilator (Visual Studio 2012) sie na mnie uparl.

Mam nastepujace pliki:
Main.cpp:
C/C++
#include <windows.h>
#include <windowsx.h>
#include "classes.cpp"
#include "resources.h"
#include "db.h"

classes.cpp:
#include <windows.h>
i definicje klas i struktur

resources.h:
zawiera od razu same #define roznych IDD i IDC z dialogow i kontrolek w resources.rc

db.h
zawiera od razu same definicje funkcji pozniej napisanych w db.cpp

jest jeszcze plik db.cpp:
C/C++
#include <windows.h>
#include "db.h"
#import "C:\Program Files\Common Files\System\ado\msado26.tlb" rename( "EOF", "ADOEOF" )
i dalej body funkcji wczesniej zainicjowanycgh w db.h

po nacisnieciu kompiluj kompilator ZAWSZE zaczyna kompilowac od db.cpp oczywiscie odnoszac sie do np klas ktore zdeklarowane sa dopiero w classes.cpp i wywala blad.
wiec pomyslalem ze celowo wymusze zeby db.cpp sie kompilowalo dopiero po classes.cpp i main zmienilem na nastepujace:
Main.cpp:
C/C++
#include <windows.h>
#include <windowsx.h>
#include "classes.cpp"
#include "resources.h"
#include "db.h"
#include "db.cpp" //nowe
i co?
i kompilator uparcie dalej zaczyna od db.cpp

a ja chce zeby zaczal od classes.cpp poniewaz tam deklaruje klasy ktore pozniej sa uzywane w db.cpp
P-71622
m4tx
» 2012-12-22 10:31:52
Dzielisz kod w zły sposób :) Nie posiadasz pliku nagłówkowego dla pliku classes.cpp (czyli nie utworzyłeś pliku classes.hpp lub classes.h) i wskutek tego po prostu to nigdy nie będzie działać. Kolejność kompilowania nie ma tu nic do rzeczy.
Tutaj masz tutorial - przeczytaj i powinieneś wiedzieć już jak to zrobić :) » Kurs C++Dzielenie kodu na kilka plików źródłowych lekcja
P-71623
berkov
Temat założony przez niniejszego użytkownika
» 2012-12-22 11:15:31
Wczesniej wszystko dzialalo dopoki nie odnioslem sie do mojej klasy (USERS) w db.cpp ktora byla zdeklarowana w classes.cpp albo w main.cpp...
nie mniej jednak sprobowalem tego co powiedziales. w main.cpp zamienilem #include "classes.cpp" na #include "classes.h". utworzylem classes.h piszac w nich naglownki (class USERS;) moich klas ktore pozniej sa zdefiniowane w classes.cpp. w classes. cpp dodalem rowniez #include classes.h... i co? teraz ta klasa jest nawet niedostepna w main.cpp:

main.cpp(21): error C2512: 'USERS' : no appropriate default constructor available
main.cpp(226): error C2027: use of undefined type 'USERS'

konstruktora w klasie nie mam bo go nie potrzebuje, niech bedzie automatyczny.. ale probowalem rowniez stowrzyc swoj wlasny konstruktor zerujacy wszystkie publiczne zmienne (zeby cos sobie robil) i pomimo tego dalej dostaje info ze no appropriate default constructor available.

----
UPDATE:
dodam tylko ze linia main.cpp(21) todeklaracja: USERS *user_info = new USERS;
gdzie drugie slowo USERS (po new) jest podkreslone na czerwono z komunikatem "incomplete type is not allowed"
P-71627
kubawal
» 2012-12-22 11:18:43
#include "db.cpp"
 
 Dyrektywą #include załączasz tylko pliki *.h i *.hpp!

Jaki jest kod?
P-71629
berkov
Temat założony przez niniejszego użytkownika
» 2012-12-22 11:24:50
@kubawal,
wiem ze mozna zalaczyc tez plik *.cpp bo nie raz probowalem .. ale zgodnie z rada m4tx wszedzie mam juz zalaczone *.h ktore "predefinuja" to co pozniej dokladnie definiuje w odpowiednich *.cpp.
Kod jest juz bardzo dlugi, kikunasto stronnicowy, nie ma sensu go wklejac.
P-71632
xevuel
» 2012-12-22 11:29:52
Kod jest juz bardzo dlugi, kikunasto stronnicowy, nie ma sensu go wklejac.
Nasza odpowiedź definiująca wszystkie możliwe przypadki popełnienia błędu też jest już bardzo długa, kilkunastostronicowa, i nie ma sensu jej wklejać.
P-71634
kubawal
» 2012-12-22 11:38:04
Dyrektywa #include po prostu wkleja całą zawartość pliku, który ma podany.
Nie interesuje ją jakiego formatu jest plik.
Jeśli załączasz pliki *.cpp, to pewnie wyskakiwały ci błędy typu
class USER is already defined
 :)
P-71635
berkov
Temat założony przez niniejszego użytkownika
» 2012-12-22 11:42:24
@xevuel
kod posiada duzo (nazwijmy to) poufnych informacji pewnej firmy. Mowiac ze nie ma sensu wklejac "kilkunasto stronnicowego kodu" mialem na mysli nie to ze mi sie nie chce ale bardziej ze 1. i tak nikomu nie bedzie sie chcialo go calego analizowac. 2.zmiana wszystkich tych informacji doprowadzi do modyfikacji kodu do tego stopnia ze pomoc moze okazac sie srednio juz potrzebna.

Dlatego tez pomyslalem ze informacje ktore dostarczylem powinny byc wystarczajace.

wkleje tylko nastepujace

classes.h:
C/C++
#ifndef classes_h
#define classes_h
class INVOICES;
class USERS;
#endif

classes.cpp:
C/C++
#include <windows.h>
#include "classes.h"
class USERS
{
public:
    unsigned long usr_id;
    LPSTR usr_name;
    LPSTR usr_pass;
    char usr_auth_login[ 1 ];
    char usr_invoices[ 1 ];
   
   
   
};

main.cpp:
C/C++
#include <windows.h>
#include <windowsx.h>
#include "classes.h"
#include "resources.h"
#include "db.h"
(..)
USERS * user_info = new USERS; //linia 21
(...)
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
(...) itd

resources.h i .rc nie bede wkleja bo nie ma sensu.
plik db.cpp posiada definicje funkcji dostepu do bazy danych, zaczyna sie nastepujaco
db.cpp:
C/C++
#include <windows.h>
#include "db.h"
#import "C:\Program Files\Common Files\System\ado\msado26.tlb" rename( "EOF", "ADOEOF" )
P-71638
« 1 » 2
  Strona 1 z 2 Następna strona