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

Biblioteka Header-Only

Ostatnio zmodyfikowano 2009-09-17 21:11
Autor Wiadomość
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:
C/C++
#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.
P-10296
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)
C/C++
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:
C/C++
namespace {
    //funkcje
}
Dzia ł a.M ó g ł by ś mi jeszcze wyja ś ni ć na czym polega anonimowa przestrze ń nazw ?
P-10297
GoldWolf
» 2009-09-17 19:28:36
Tu wiele do wyjaśnienia nie ma - przestrzeń.
P-10299
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
P-10300
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...
P-10301
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:
C/C++
#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ć?
P-10302
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.
P-10303
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 :)
P-10304
« 1 » 2
  Strona 1 z 2 Następna strona