Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] .obj ??

    Potete aiutarmi?
    Ho creato un semplice progetto in C++ composto da 3 files:
    "int.h":
    codice:
    bool ciao;
    bool funzione();
    "int.cpp"
    codice:
    #include "int.h"
    bool funzione()
    {
    	ciao = false;
    	return(ciao);
    }
    "main.cpp"
    codice:
    #include <iostream>
    #include "int.h"
    using namespace std;
    int main()
    {
    	system("pause");
    	return(1);
    }
    La compilazione da questo errore:
    1>main.obj : error LNK2005: "bool ciao" (?ciao@@3_NA) già definito in int.obj
    che proprio non capisco. Potete illuminarmi? grazie

  2. #2
    nel .h ci vanno i prototipi delle funzioni, i define e i typedef

    le dichiarazioni di variabili vanno tutte nel .c++

    se rileggi il messaggio che ti ha restituito è evidente che ti sta segnalando questo problema, visto che includendo il .h sia nel main.c++ che nell'altro .c++ stai dichiarando due volte le stesse variabili, cosa non possibile

  3. #3
    A me sembra di dichiararle nell'uno e inizializzarle nell'altro, cmq grazie provo a definire variabili solo nel cpp

  4. #4
    vedi l'include "int.h" come una "copia" del codice presente all'interno del file .h nei file .c

    risulta evidente che stai definendo la variabile bool sia nel main.c++ che nel int.c++, il che è sbagliato sia sintatticamente che semanticamente

  5. #5
    Ok, funziona, grazie.
    Si crea un nuovo problema:
    ho spostato bool ciao; da int.h a int.cpp, e ora non posso accedere
    a ciao da file che non siano int.cpp.

  6. #6
    questo è ovvio, è proprio per questo che si usa la suddivisione in più file

    il file client (main.c++) NON deve essere a conoscenza dei dettagli delle librerie che crei per non poterle modificare direttamente. E' proprio lo scopo, non è un problema

    volendo puoi creare (in logica funzionale) delle funzione che accedano a quelle variabili (chessò, bool getBoolValue(); e void setBoolValu(bool newValue); )
    in logica ad oggetti creeresti dei metodi pubblici appositi, tenendo quelle variabili private (il che ha lo stesso identico effetto ma è più chiaramente visibile)

    Cerca di evitare che dall'esterno delle tue librerie si possa accedere direttamente alle variabili interne ad esse


    EDIT: una discussione che spiega in modo decente la programmazione modulare:
    programmazione modulare

  7. #7
    Ti ringrazio.
    Comunque ho trovato una pseudo-soluzione.
    Definisco come tipi delle strutture nell'header cosi da poterne utilizzare le variabili dandole poi in pasto alle funzioni

  8. #8
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... Prima di tutto ti consiglio di seguire il saggio suggerimento di Celebron ... Poi se proprio vuoi farti del male puoi "risolvere" il problema con le guardie d' inclusione
    codice:
    #ifndef int_h
    #define int_h
    
    // qui il codice di int.h
    
    #endif
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  9. #9
    Originariamente inviato da KrOW
    Poi se proprio vuoi farti del male puoi "risolvere" il problema con le guardie d' inclusione
    codice:
    #ifndef int_h
    #define int_h
    
    // qui il codice di int.h
    
    #endif
    Le "guardie d'inclusione" servono per evitare inclusioni ricorsive nella stessa unità di compilazione; nel nostro caso invece l'inclusione avviene in due unità di compilazione distinte.

    Il problema è descritto dall'errore del linker:
    1>main.obj : error LNK2005: "bool ciao" (?ciao@@3_NA) già definito in int.obj
    causato perché definisce la variabile globale "bool ciao;" in un header (int.h) che poi include in due unità di compilazione (int.cpp e main.cpp), il che equivale a pretendere di definire due variabili globali con lo stesso nome;

    La soluzione, normale, al suo problema è:
    definire "bool ciao;" in int.cpp e dichiararla "extern bool ciao;" in int.h.
    ;-)

  10. #10
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ti ringrazio per la correzione ... Non so perché ero convinto che il suo problema era la defiizione della variabile in un header che veniva incluso due volte nella stessa unità di compilazione ... Si vede che fatta una certa ora é meglio non guardarlo nemmeno il forum anzi chiudo qui prima di spararne un' altra ... Grazie ancora
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.