Newsgroup: it.comp.lang.c++
Titolo: funzioni inline e separazione interfaccia-implementazione

Ciao,
Ho un dubbio su come possa fare a creare una libreria con tutte
funzioni inline separando l'interfaccia dall'implementazione.
Se metto l'implementazione nel file .h chiaramente tutto funziona ma a
questo punto avere la libreria non ha senso perche' quando includo
tutto do anche via l'implementazione, se separo mi da error di linking
(chiaramente).
Shezad.

 funzioni inline separando l'interfaccia dall'implementazione.
Vuoi avere la botte piena e la moglie ubriaca.
E.

?manu* ha scritto:

Penso sia utile spiegare perche' non e' fattibile quello che chiede l'OP.
In un file di libreria linkabile (staticamente o dinamicamente) ci sono
routine e dati, ognuno con un suo indirizzo. Il codice eseguibile che li
utilizza viene generato dal compilatore con lo spazio riservato per gli
idirizzi di dati e routine esterni. Il linker ha proprio il compito di
risolvere tali indirizzi, cio' modificare il programma in modo che
faccia riferimento alle routine e alle variabili della libreria. In tal
caso, le routine non sono espanse inline.
Un linker standard non e' affatto capace di espandere inline una
chiamata di funzione, mentre un compilatore standard, pur essendo in
grado di espandere una funzione di cui conosce il codice sorgente, non
e' in grado di espandere una funzione di cui conosce solo il codice
macchina.
Per ottenere l'espansione inline di una funzione di cui si dispone
solamente del codice macchina, sarebbe necessario riprogettare i ruoli
del compilatore e del linker.
In effetti, questo e' stato fatto dalla Microsoft con il compilatore
Visual C++ impostando con l'opzione di compilazione "Ottimizzazione
intero programa" al valore "Attiva generazione codice in fase di
collegamento" (equivalente all'opzione "/GL"), e impostando l'opzione di
linking "Generazione di codice in fase di collegamento" al valore "Usa
Generazione codice in fase di collegamento" (equivalente all'opzione
"/LTCG" o "/ltcg"). Purtroppo tali opzioni funzionano solamente 
all'interno di un progetto, cioe' permettono di espandere inline una 
funzione dichiarata in un file sorgente e utilizzata in un altro, ma 
solamente se entrambi i file sorgente appartengono allo stesso progetto, 
cioe' sono utilizzati per generare un solo file target (programma o 
libreria).
Quello che chiede l'OP non mi risulta che sia mai stato realizzato, sia 
perche' ci sono enormi difficolta' tecniche nel realizzarlo, sia forse 
perche' non c'e' una sufficiente richiesta del mercato.
Infatti suppongo che la motivazione di tale richiesta sia mantenere 
segreto il codice sorgente, allo scopo di mantenerne l'esclusiva. 
Tuttavia, la maggior parte delle librerie hanno almeno una funzione 
complessa e importante che non e' utile espandere inline, e quindi il 
fatto che tale funzione non sia disponibile come codice sorgente, rende 
comunque difficile riprodurre i sorgenti dell'intera libreria.
Inoltre, le funzioni che risulta utile espandere inline sono funzioni 
molto brevi, e quindi comunque facili da reinventare e facili da 
analizzare per chi sa leggere il codice disassemblato.
In sostanza, non ne vale la pena.
-- 
Carlo Milanesi
http://digilander.libero.it/carlmila

 > 
shezad....@gmail.com
 ha scritto:

Grazie per la spiegazione.

Ciao Carlo,
scuriosavo tra i vari post...
complimenti per l'interessante risposta !