Newsgroup: it.comp.lang.c++
Titolo: Come "collegarsi" con funzioni globali?

Ciao o, Sacro NG...
Mi imbatto spessissimo nel problema di librerie matematiche in C 
a cui, ovviamente, ci si interfaccia tramite funzioni globali. 
Ogni volta che provo a chiamare queste funzioni dalle mie classi 
altrettanto ovviamente il compilatore protesta.
Il modo di venirne fuori lo trovo, di solito. Se la funzione ï¿œ 
piccola e il contesto lo permette/suggerisce (e.g. classi 
"self-contained" che non necessitino di complicate relazioni con 
il resto del mondo che magari potrebbe esistere solo sul mio PC) 
copincollo e la faccio diventare un metodo della classe, pur 
conscio della bruttezza della soluzione e della moltiplicazione 
di codice uguale. Altre volte, faccio diventare la funzione 
friend, altre volte ancora faccio pasticci peggiori che si 
risolvono spesso nel dover dichiarare la funzione "static" anche 
se non so perchï¿œ pur temendo che in caso di multithreading e/o 
istanze multiple di classe qualche pastrocchio avverrï¿œ senza dubbio.
La domanda ï¿œ: esiste un metodo pulito, diciamo standard e 
possibilmente alla mia portata per non fare zozzerie in casi 
come questo? Spesse volte si tratta di funzioni che ne 
richiamano dozzine di altre e devo gettare la spugna o editare a 
manetta... :(
grazie!
Apx.

 Apx.
Se non ho capito male la domanda ti basta anteporre alla chiamata
delle funzioni globali il "::", ad esempio se vuoi usare la write di
unistd.h dalla tua classe devi accedere al namespace globale usandola
come "::write"
Gianni

 come "::write"
Mi sa che mi sfugge qualcosa di ovvio --- non basta un
#include <unistd.h>
all'inizio, e poi chiamare write() normalmente?
Pleg

 altrettanto ovviamente il compilatore protesta.
La prima cosa di cui devi accertarti, quando #includi header C in sorgenti
C++, � che le funzioni siano dichiarate 'extern "C"'. Questo spesso (ma non
sempre) viene garantito da appropriate istruzioni per il precompilatore
inserite appositamente dagli stessi autori degli header, come:
 #ifdef  __cplusplus
  extern "C" {
 #endif
   (codice C )
 #ifdef  __cplusplus
   }
 #endif
Se gli header che cerchi di usare sono privi di queste istruzioni, puoi
ovviamente modificarli tu, oppure #includerli in questo modo:
 extern "C" {
   #include "your_header.h"
 }
Max

 alla mia portata per non fare zozzerie in casi come questo? 
Spiegami meglio il problema ... io non l'ho capito bene. A 
me le funzioni globali (e indi anche con linkage esterno di 
default) non hanno mai creato problemi di visibilità a 
chiamarle direttamente ... Anche se ne ho avuti istanziando 
puntatori, perché presupponevo un tipo diverso e errato.
Prova un mini esempio
ciao
Soviet


 non me ne intendo per garantirlo, allora casca tutto.
Se il codice non e' automodificante, non c'e' alcun problema: i vari
thread di un processo eseguono lo stesso codice senza pestarsi i
piedi, dato che e' read-only.
Un codice automodificante multi-threaded... non l'ho mai sentito, e
non voglio vederlo :)
Pleg

Grazie a tutti e scusate la domanda posta male, a
mia discolpa posso dire che non vedo aria
condizionata da mesi... Il problema mi sorge quando
dalla funzione di libreria globale devo accedere
alla classe cercando di non introdurre metodi
pubblici che userebbe solo la funzione globale ma in
realtà distruggono leggibilità, isolamento dati
eccetera. Ma mi sa che non ho scelta, non credo il
C++ sia nato per permettere queste zozzerie.
ciauzzz
Apx.
-- 
"La teoria è sapere come funzionano le cose e
non sapere come farle funzionare; la pratica è
sapere come far funzionare la cose senza sapere come
funzionano; il nostro scopo è unire la pratica
alla teoria per riuscire a non far funzionare
le cose senza capire come abbiamo fatto"

PS - ovviamente so che posso farla diventare friend
della classe ma non mi piace lo stesso...


On Aug 18, 4:49 pm, Archeopteryx

Se ho capito la domanda iniziale:
* nel caso delle funzioni C standard, basta usare gli header con la
"c" davanti (ad esempio, #include <cmath> al posto di #include
<math.h>) e le funzioni sono nel namespace std;
* nel caso delle funzioni di altre librerie, credo sia possibile fare:
namespace fftw
{
   #include <fftw.h>
}
Se ci sono i famosi #ifdef __cplusplus // extern "C" // etc. di cui
sopra, dovrebbe andare, anche se è molto che non provo.
Ciao,
Matteo

 Se ho capito la domanda iniziale:
Credo che il suo problema sia che le funzioni C che usa non "conoscono"
il C++ e di fatto lui e' costretto ad esporre quelli che sono
sostanzialmente degli handle sugli internals della classe per le
funzioni C. 
Il che ovviamente non ha particolari vie di scampo. O meglio la
soluzione con gli handles e' la piu' pulita fra le zozzerie che mi
vengono in mente sui due piedi e posto di avere capito il problema.
-- 
-riko

 problema.
yess sir, hai capito quello che ho espresso male io
che ho il problema :D Mi consolo pensando che poteva
esistere qualche soluzione banale, elegantissima e
chiara, e che io non la conoscessi. A questo punto va
benissimo così, e del resto è da tempo che metto una
pezza alla cosa con un sistema mio di nomi di
variabili e funzioni, che mi aiuta a capire a colpo
d'occhio cosa sto facendo.
come sempre, grazie a tutti!
Apx.
