Enum e costanti in librerie esterne

di il
4 risposte

Enum e costanti in librerie esterne

Salve,

ho realizzato un linguaggio di programmazione, diciamo che ho svolto l'80% del lavoro.
In questo momento sto aggiungendo gli enumeratori mentre le costanti sono state implementate e sono funzionanti.
Passando all'implementazione degli enum, sono sorti dei dubbi, facendomi poi ricredere l'uso delle costanti che ho già implementato.
Parto dalle costanti così capite bene il problema.
Il valore delle mie costanti si trovano nell'eseguibile/libreria, il codice sorgente non ha intestazioni come c/c++ e possono essere dichiarate solo all'interno di una classe, simile ad una costante statica in c++(.h) ma con valore assegnato nel source(.cpp).
Ho usato questo approccio perchè se dovessi creare una libreria "Pippo" con costante "MyClass.TOPOLINO = 99" e dovessi utilizzarla successivamente in un eseguibile, il valore rimarrebbe legato alla libreria e non all'eseguibile.
In poche parole ricompilando la libreria e cambiando il valore della costante TOPOLINO a 100 senza ricompilare l'eseguibile, il risultato sarebbe 100 e non 99.
Questo discorso non posso affrontarlo con gli enumeratori perchè per essere visibili all'esterno, devono trovarsi nell'intestazione.

La mia domanda non è come farlo nel mio linguaggio ma come fareste voi in C++ o C per ottenere il valore della costante(enum) presente nella libreria senza ricompilare l'eseguibile?
Sbaglio o esiste un motivo valido per cui le costanti/enum debbano essere assegnate nelle intestazioni?
Sbaglio a preoccuparmi del valore della costante/enum in una libreria esterna?
Ma se il mio ragionamento fosse corretto non sarebbe sbagliato in C o C++ visualizzare 99 invece che 100?

Grazie.

4 Risposte

  • Re: Enum e costanti in librerie esterne

    @Coco: non si e' capito NIENTE.

    stai mescolando il concetto applicazione composta da LIBRERIE STATICHE con quello usando LIBRERIE DINAMICHE.

    Se usi una libreria STATICA , DEVI ricompilare l'applicazione
    Se usi una libreria DINAMICA, BASTA ricompilare la libreria.

    Il motivo per cui in C++ le costanti si definiscono nei .h e' storico/strutturale: al contrario di linguaggi come Java, e per la presenza di una fase di compilazione che compila in modo NATIVO, e' necessario avere un file dove sono DEFINITI gli oggetti esportati da una libreria e che un'altra puo' importare.

    Ma e' una peculiarita' del C/C++. Altri linguaggi come Java o "D" (ESISTE un linguaggio che si chiama "D" anzi, "dlang" MOOLTO simile al C++ ma con un'approccio alla Java) NON ESISTE un file .h, ma importi un'altro oggetto, il "modulo" che fa le stesse veci del file ".h" ma che viene generato AUTOMATICAMENTE in fase di compilazione.
  • Re: Enum e costanti in librerie esterne

    Ok forse non mi sono spiegato bene, ecco un esempio.

    A. CODICE LIBRERIA libtest.so
    File test.h
    
    #include <iostream>
    
    const int PIPPO = 300;
    
    class Test {
      public:
        enum class ENUMTEST {VALOREA=100,VALOREB=200};
        static void VisualizzaValore();
    };
    
    File test.cpp
    
    #include "test.h"
    
    void Test::VisualizzaValore(){
      cout << (int)ENUMTEST::VALOREA << " " << (int)ENUMTEST::VALOREB << "\n";
      cout << PIPPO << "\n";
    }
    
    B. CODICE ESEGUIBILE
    File main.cpp
    
    #include "test.h"
    
    #include <iostream>
    
    int main(int argc, char * argv[]) {
      Test::VisualizzaValore();
      cout << (int)Test::ENUMTEST::VALOREA << " " << (int)Test::ENUMTEST::VALOREB << "\n";
      cout << PIPPO << "\n";
    }
    
    Il risultato dell'eseguibile è:
    
    100 200     <== Test::VisualizzaValore()
    300          <== Test::VisualizzaValore()
    100 200     <== main eseguibile
    300          <== main eseguibile
    
    Adesso se modifico le costanti del file test.h e compilo solo la libreria:
    
    #include <iostream>
    
    const int PIPPO = 3000;
    
    class Test {
      public:
        enum class ENUMTEST {VALOREA=1000,VALOREB=2000};
        static void VisualizzaValore();
    };
    
    Il risultato dell'eseguibile è:
    
    1000 2000    <== Test::VisualizzaValore()
    3000             <== Test::VisualizzaValore()
    100 200        <== main eseguibile
    300               <== main eseguibile
    
    come puoi vedere l'eseguibile mostra i valori in maniera differente.

    Sulle costanti però utilizzando questo metodo:
    
    class Test {
      public:
        static const int PIPPO;
        enum class ENUMTEST {VALOREA=1000,VALOREB=2000};
        static void VisualizzaValore();
    };
    
    e nel source test.cpp assegno il valore 3000:
    
    #include "test.h"
    
    const int Test::PIPPO = 3000;
    
    void Test::VisualizzaValore(){
      cout << (int)ENUMTEST::VALOREA << " " << (int)ENUMTEST::VALOREB << "\n";
      cout << PIPPO << "\n";
    }
    
    il risultato è:
    
    1000 2000    <== Test::VisualizzaValore()
    3000             <== Test::VisualizzaValore()
    100 200        <== main eseguibile 
    3000             <== main eseguibile - in questo caso cambia
    
    il valore 100 e 200 dell'enum non è quello della libreria ma dell'eseguibile.

    Ora immagina 10 librerie legate alla libreria di test, per poter recuperare il valore della costante necessitano di una nuova compilazione.
    Ecco perchè chiedevo il parere degli esperti, per capire se è una cosa normale o un bug del compilatore.
    Ma sopratutto per capire se il mio linguaggio dovrà tener conto di una o entrambi i casi.
  • Re: Enum e costanti in librerie esterne

    @coco, stai usando I termini in modo errato.
    Non hai scritto un ""linguaggio""! Questo termine ha un significato MOLTO specifico in computer science, ed e' un'operazione che di puo' fare.

    Tu hai scritto un'applicazione che fa uso di una libreria 'dinamica' visto che l'estensione e' '.so'

    L'operazione che hai fatto e' fattibile dal punto di vista della ''fattibilita', ma assolutamente sbagliata dal punto di vista della programmazione.

    I file .h, .c e .so di una libreria DEVONO SEMPRE essere mantenuti allineati. Una volta creata la libreria, e' assolutamente sbagliato modificare il corrispondente .h.

    Vedila in questo modo: la libreria e' come uno scatolone chiuso, ed il .h e' come il foglio che contiene la lista delle cose contenute nello scatolone. Questo foglio viene preparato da chi ha preparato lo scatolone, NON da chi deve trasportare lo scatolone CHIUSO da un posto all'altro.

    Quello che hai fatto tu e' stato modificare il foglio, DOPO aver preparato e chiuso lo scatolone.

    Si puo' fare perche' il C/C++ e' un linguaggio nato nel 1970, e certe 'raffinatezze' non erano ancora state inventate, ma e' ASSOLUTAMENTE SBAGLIATO farlo.

    Inoltre, i compilatori sono applicazioni che hanno 20/30 anni di svilluppo, usati da milioni di programmatori. E' impossibile che abbiano degli errori. Se qualcosa non funziona, e' certo al 110% che e' un problema del programmatore.

    Per mantenere l'allineamento tra .h, .c e diverse librerie, ci sono strumenti appositi, nati PROPRIO per risolvere questo tipo di problemi: se uno modifica il .h di una libreria, AUTOMATICAMENTE viene ricompilala la libreria E TUTTO QUELLO che dipende dalla libreria, in questo caso l'applicazione.
    Il piu' famoso ed antico e' "make".
    Uno piu' moderno e' "cmake".
  • Re: Enum e costanti in librerie esterne

    @migliorabile grazie per le risposte,

    Secondo te dovrei evitare di far succedere questa cosa nel mio linguaggio? i valori delle costanti sono riuscito a piazzarli nel file .o ma gli enum no.
    Quando dico sono riuscito a piazzarli nel file .o, significa che sono riuscito a riscriverlo in linguaggio macchina.
    Diciamo che assegnare le costanti in fase di compilazione sarebbe stato più semplice ma non vorrei che succedere quello che ho spiegato sopra.

    Grazie comunque.
Devi accedere o registrarti per scrivere nel forum
4 risposte