steckel Temat założony przez niniejszego użytkownika |
Biblioteka Header-Only » 2009-09-17 17:21:31 Mam problem z tworzeniem biblioteki Header-Only. O to jej kod: #ifndef WINDOWS_HPP #define WINDOWS_HPP
#include <windows.h> #include <string>
using namespace std;
void LoadFile( string pathOfFile, string & text ) { LPSTR Bufor; DWORD dwRozmiar, dwPrzeczyt; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); dwRozmiar = GetFileSize( hPlik, NULL ); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ); Bufor[ dwRozmiar ] = 0; text = Bufor; GlobalFree( Bufor ); CloseHandle( hPlik ); }
void SaveFile( string pathOfFile, string txt ) { LPSTR Bufor; DWORD dwRozmiar = txt.length(); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); Bufor =( LPSTR ) txt.c_str(); DWORD dwZapisane; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ); CloseHandle( hPlik ); }
#endif
Zapisałem ją w katalogu include i mam takie błędy przy includowaniu jej w programie: 1>------ Build started: Project: statki1, Configuration: Release Win32 ------ 1>Compiling... 1>main.cpp 1>class.cpp 1>Linking... 1>main.obj : error LNK2005: "void __cdecl SaveFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?SaveFile@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) already defined in class.obj 1>main.obj : error LNK2005: "void __cdecl LoadFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?LoadFile@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAV12@@Z) already defined in class.obj 1>C:\Documents and Settings\User\Moje dokumenty\Visual Studio 2008\Projects\statki1\Release\statki1.exe : fatal error LNK1169: one or more multiply defined symbols found 1>Build log was saved at "file://c:\Documents and Settings\User\Moje dokumenty\Visual Studio 2008\Projects\statki1\statki1\Release\BuildLog.htm" 1>statki1 - 3 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Funkcje LoadFile i SaveFile są zapisane w tej bibliotece. Użycie przestrzeni nazw nie pomogło. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-17 18:27:56 To robiło błędy: vague linkage void SaveFile(string pathOfFile,string txt)
D:\p rojekty\include\windows.hpp( 11 ) : error C2146 : syntax error : missing ';' before identifier 'linkage' 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C2144 : syntax error : 'void' should be preceded by ';' 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2146 : syntax error : missing ';' before identifier 'linkage' 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2086 : 'int vague' : redefinition 1 > D:\p rojekty\include\windows.hpp( 11 ) : see declaration of 'vague' 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2144 : syntax error : 'void' should be preceded by ';' 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2086 : 'int linkage' : redefinition 1 > D:\p rojekty\include\windows.hpp( 11 ) : see declaration of 'linkage' 1 > class.cpp 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C2146 : syntax error : missing ';' before identifier 'linkage' 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C2144 : syntax error : 'void' should be preceded by ';' 1 > D:\p rojekty\include\windows.hpp( 11 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2146 : syntax error : missing ';' before identifier 'linkage' 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2086 : 'int vague' : redefinition 1 > D:\p rojekty\include\windows.hpp( 11 ) : see declaration of 'vague' 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2144 : syntax error : 'void' should be preceded by ';' 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C4430 : missing type specifier - int assumed.Note : C++does not support default - int 1 > D:\p rojekty\include\windows.hpp( 25 ) : error C2086 : 'int linkage' : redefinition 1 > D:\p rojekty\include\windows.hpp( 11 ) : see declaration of 'linkage' Natomiast to: namespace { } Dzia ł a.M ó g ł by ś mi jeszcze wyja ś ni ć na czym polega anonimowa przestrze ń nazw ? |
|
GoldWolf |
» 2009-09-17 19:28:36 |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-17 19:38:59 Czyli namespace zawsze dawać do bibliotek Header-Only. Dzięki wszystkim za pomoc! :D |
|
GoldWolf |
» 2009-09-17 19:46:59 Czyli namespace zawsze dawać do bibliotek Header-Only.To raczej nie jest najlepszy wniosek.
21.4 Kiedy warto stosować przestrzenie nazw
* Mogą zastąpić zmienne i statyczne zmienne globalne,
* gdy tworzymy bibliotekę funkcji i klas,
* tworząc większy projekt powinniśmy dokładniej przyjrzeć się temu zagadnieniu i wykorzystać jego plusy.
Należy jednak pamiętać by na siłę nie próbować stosować przestrzeni nazw, maja one pomóc nam w programowaniu. Jeśli więc tworzysz przestrzenie nazw to zastanów, by nie popełnić błędów.
Ty lepiej z głową rób pliki nagłówkowe... |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-17 20:15:39 * gdy tworzymy bibliotekę funkcji i klas
Ja właśnie tworzę bibliotekę funkcji. Jeśli więc tworzysz przestrzenie nazw to zastanów, by nie popełnić błędów.
To raczej na każdym kroku, a nie tylko w przestrzeniach nazw. Ty lepiej z głową rób pliki nagłówkowe...
Moja biblioteka wygląda teraz tak: #ifndef WINDOWS_HPP #define WINDOWS_HPP
#include <windows.h> #include <string>
using namespace std;
namespace { void LoadFile( string pathOfFile, string & text ) { LPSTR Bufor; DWORD dwRozmiar, dwPrzeczyt; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); dwRozmiar = GetFileSize( hPlik, NULL ); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ); Bufor[ dwRozmiar ] = 0; text = Bufor; GlobalFree( Bufor ); CloseHandle( hPlik ); } void SaveFile( string pathOfFile, string txt ) { LPSTR Bufor; DWORD dwRozmiar = txt.length(); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); Bufor =( LPSTR ) txt.c_str(); DWORD dwZapisane; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ); CloseHandle( hPlik ); } }
#endif
Sugerujesz, że coś tu jest niepoprawnie lub lepiej tego unikać? |
|
GoldWolf |
» 2009-09-17 20:35:41 Sugerujesz, że coś tu jest niepoprawnie lub lepiej tego unikaćTen fragment jest z kursu i nie chciało mi się go obcinać więc część zdań jest do początkujących macherów... Jestem za mało doświadczony(czyt. słaby) by coś więcej ci doradzić. Miałeś problem, a wniosekCzyli namespace zawsze dawać do bibliotek Header-Only.chyba rozumiesz, że nie jest najlepszy. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-17 20:45:04 Ja tym bardziej nie jestem doświadczony, stąd ten uproszczony wniosek, ale jak na razie nie mam z tym problemów :) |
|
« 1 » 2 |