Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - File Header.h
Forum - C/C++ - File Header.h

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2306
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:18
Martedì, 28/07/2015
Scusate la mia ignoranza nel linguaggio.

Ma non ho capito precisamente a cosa può servire il file header.
Sto facendo progetto provo a descrivervi velocemente cosa ho fatto magari dicendo
se è corretto il mio modo di usare i file header oppure ho sbagliato completamente l'approccio.


main.h
Codice sorgente - presumibilmente C++

  1. #include <windows.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <windows.h>
  5. #include <tlhelp32.h>
  6.  
  7. class Memory
  8. {
  9.  
  10. public:
  11.     void AttaccaProc(void);
  12.     void GetAddressPtr(HWND proc,DWORD Address);
  13.     bool WriteInt32(HWND proc,DWORD Address,int Value);
  14.     int ReadInt32(HANDLE HwndProc,LPVOID *address,DWORD Offset1,DWORD Offset2,DWORD Offset3);
  15.  
  16. };





main.cpp
Codice sorgente - presumibilmente C++

  1. #include "main.h"
  2.  
  3. typedef DWORD IntPtr; //Riferimento a C#
  4.  
  5. extern "C" __declspec(dllexport) void __stdcall AttaccaProcesso();
  6.  
  7.  
  8.  
  9. void Memory::AttaccaProc()
  10. {
  11.     //Codice
  12. }
  13.  
  14.  
  15. void Memory::GetAddressPtr(HWND proc,IntPtr Address)
  16. {
  17.     //CODICE
  18. }
  19.  
  20.  
  21. bool Memory::WriteInt32(HWND proc,IntPtr Address,int Value)
  22. {
  23.     //Codice
  24.  
  25.     return true;
  26. }
  27.  
  28.  
  29.  
  30. int Memory::ReadInt32(HANDLE Hproc,LPVOID *address,IntPtr offset1,IntPtr offset2,IntPtr offset3)
  31. {
  32.  
  33.     return 0;
  34. }




Chiaramente ho eliminato il codice nelle funzioni altrimenti la discussione era troppo lunga
è solo per mostrare se uso correttamente i file di instazione.
Volevo sapere se sbaglio qualcosa.


Ultima modifica effettuata da Thejuster il 28/07/2015 alle 17:19


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:29
Martedì, 28/07/2015
Si è corretto. I file di intestazione servono ad informare il compilatore (che compila i sorgenti uno ad uno) di cosa sarà disponibile al momento del linking (ovvero quando tutti i file compilati saranno uniti nell'eseguibile finale). Prima del linking la classe Memory non esiste "globalmente", ma solo dove Memory è definita. In parole provere il file di intestazione serve per dire al compilatore "sta tranquillo, al momento del linking troverai tutto".

Nel file header devono essere presenti i prototipi di funzione e la definizione della classe, altrimenti AD OGNI SORGENTE sarà compilato il metodo presente nell'header, quindi ti ritroveresti con x sorgenti compilati che contengono ognuno un metodo che si chiama allo stesso modo, fa le stesse cose e, inevitabilmente, entrerà in conflitto con gli altri x -1 metodi uguali, facendo sì che il linker ti consegni un bellissimo errore.

E' chiaro adesso?

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2306
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:34
Martedì, 28/07/2015
si grazie DarkJuster molto utile questa spiegazione.
Pensavo di confondere un pò tutto sopratutto le idee vedendo sorgenti di esempio sul web.

Perché molti esempi sono fatti tutti in un solo file cpp.

esempio gli include, spesso vedo che vengono dichiarati nel file cpp e non nell'header.

o esempio altri dichiarano classi e costruttori direttamente nel file cpp per questo avevo dei dubbi.
proprio sulla corretta programmazione.

Grazie mille DarkJuster Saluti :k:


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:06
Martedì, 28/07/2015
Di niente :k::k::k:

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 20:05
Martedì, 28/07/2015
Testo quotato

Postato originariamente da Thejuster:
Perché molti esempi sono fatti tutti in un solo file cpp.

esempio gli include, spesso vedo che vengono dichiarati nel file cpp e non nell'header.

o esempio altri dichiarano classi e costruttori direttamente nel file cpp per questo avevo dei dubbi.
proprio sulla corretta programmazione.


è una cattiva pratica, si rischia molte volte il conflitto tra prototipi se si include piu volte il file in un progetto. Cosa che non succede usando la prassi del header file con
Codice sorgente - presumibilmente C/C++

  1. #ifndef FILE_H
  2. #define FILE_H
  3. //contenuto header file
  4. #endif


Inoltre non utilizzare l'header file impedisce di precompilare le librerie, pratica necessaria se si vuole nascondere il codice a colui che le utilizzerà.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2306
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:16
Mercoledì, 29/07/2015
Capisco.

Anche se sono un maniaco accanito del C#
sto guardando l'enorme abisso che distacca C++ da C# non c'è proprio paragone.
Sto scoprendo l'eleganza del C++.
Anche se è un linguaggio molto difficile da apprendere fino in fondo mi trasmette tanta passione.
proverò ad impararlo come si deve.



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 12:22
Mercoledì, 29/07/2015
C/C++ e C# condividono solo parte della sintassi, per il resto C/C++ sono una cosa C# è un altra, anche io ho avuto la malsana idea di partire dal C# ed arrivare al ANSI C infatti ricordo quanto fu difficile passare dal semplice linguaggio interpretato al C#. Se potessi tornare indietro è probabile che mi consiglierei di partire dal C semplice ed elegante per poi introdurre il C++ (in fondo dal C al C++ è questione di attimi) e poi solo in fine addentrarmi nel complicato ed articolato mondo del .NET framework.
In ogni caso, il mio passaggio al C è stato prima un obbligo formativo e poi una necessità dettata dal favoloso mondo dei microcontrollori.

PM Quote