Newsgroup: it.comp.lang.c++
Titolo: problema con #include

sto cercando di includere in un programma c++ un file header scritto per
il C (e' l'include dello storage manager di INN)
il problema e' nell'header vengono usati variabili dal nome "class", 
"private", ecc. che nel c++ sono delle keyword; ovviamente a compile
time g++ si arrabbia molto...
cosa posso fare?
grazie e ciao
Kronos
-- 
Home: 
http://kronoz.tsx.org
Non ho ancora capito se il mio cane e' maschio o femmina:
quando fa la pipi' si chiude in bagno


utilizza i namespace.
namespace header_c {
#include "header_c.h";
}
e poi per chiamre le funzioni dell'header header_c::funzione();
Ciao Fbf.

 }
non funziona:
---post.cpp
namespace storage {
#include "storage.h"
}
----
---storage.h
typedef struct {
    STORAGETYPE         type;
    STORAGECLASS        class;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^ Errore linea 31
    char                token[STORAGE_TOKEN_LENGTH];
} TOKEN;
typedef struct {
    unsigned char       type; 
    char                *data;      
    int                 len;      
    unsigned char       nextmethod; 
    void                *private;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Errore linea 41
    time_t              arrived;
    TOKEN               *token;
} ARTHANDLE;
----
kronos:~/cpp/post$ g++ -c rpost.cpp
In file included from rpost.cpp:12:
storage.h:31: parse error before `;'
storage.h:41: parse error before `private'
ciao
Kronos
-- 
Home: 
http://kronoz.tsx.org
Runtime error 6D at f000:a12f : user incompetente

 e poi per chiamre le funzioni dell'header header_c::funzione();
...ma questo non dovrebbe comunque permettere di ridefinire parole riservate
del linguaggio, credo... tanto è vero che posso dichiarare una classe
all'interno di un namespace, quindi la keyword "class" funziona
perfettamente.
Massimo

 Home: 
http://kronoz.tsx.org


 perfettamente.
Hai pienamente ragione. Ho risposto in maniera affrettata e superficiale.
In questo caso si può creare una nuova interfaccia per quell'header,
che non utilizzi le keyword. Esempio:
header_c.h //header che voglio utilizzare
int class();
header_cpp.h //nuovo header con le keyword modificate
int _class (); //o meglio un prefisso adeguato al significato della libreria
header.cpp.c //gateway verso il vecchio header
#include "header_c.h"
int _class() { return class(); }
e poi utilizzo l'header_cpp nel mio programma.
Questo comporta che bisogna riscrivere un header anche non le funzioni da non
modificare, una nuova interfaccia completa con la libreria insomma.
Inoltre ci potrebbe anche essere qualche problema con le convenzioni dei nomi
per le funzioni tra l'obj della libreria e il mio programma.
Ad esempio il Visual C++ offre __stdcall ed extern "C" per sopperire a questi
problemi.
Questa è la soluzione più pulita.
Se invece è disponibile in codice sorgente della libreria, si potrebbe
semplicemente
definire delle macro prima di includere l'header. Ad esempio:
#define class _class
#include "header_c.h"
#undef class
In questa maniera cambio automaticamente il nome delle keyword non permesse
(attenzione
a non scegliere un nuovo nome già utilizzato all'interno della libreria) e posso
chiamare
la funzione con _class().
Cambiando il nome della funzione nell'header, questa chiaramente non linka più
con
l'obj della libreria creato con un nome diverso. Per questo è necessario
modificare i
file della libreria per includere le macro e cambiare il nome delle funzioni.
Ricompilare
la libreria e poi linkarla con la nuova applicazione c++.
Ciao Fbf.

 } ARTHANDLE;
Se si tratta solo di strutture puoi mettere dei define prima
dell'inclusione del
file:
#define class _class
#define private _private
#include "storage.h"
#undef class
#undef private
in quanto, se non sbaglio, il nome dei membri di una struttura e'
irrilevante per il link.
Ciao Fbf

 irrilevante per il link.
evvai!
cosi' compila e fa il link: ho fatto delle prove e sembra che funzioni
:)
e pensare che avevo gia' iniziato a scrivere la nuova interfaccia...
ciao e grazie
Kronos
-- 
Home: 
http://kronoz.tsx.org
Il coraggio non mi manca.
E' la paura che mi frega...

 #define private _private
C'era un interessante articolo di Carlo Pescio sull'uso del carattere _ ( 
underscore ) *prima* di un etichetta, in cui diceva che lo standard piu' o 
meno si riserva le parole che iniziano con _; l'autore concludeva 
suggerendo di usare la sintassi xxx_ piuttosto che _xxx ( ovvero 
l'underscore *dopo* anziche' *prima* ). Dico questo perche' le keyword 
_priva e _public mi sia di gia' occupate da qualche compilatore ...


Sono riservate solo gli identificatori che cominciano con un
underscore seguito da una lettera maiuscola e quelli che contengono
due underscore consecutivi.  
Gli identificatori che cominciano con un underscore seguito da
una lettera minuscola si possono usare, anche se alcuni sconsigliano
di farlo perche' alcuni compilatori non standard potrebbero
trattarli come identificatori riservati.
	Mauro