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.