Il C++

2010-06-02 12 views
5

Eventuali duplicati:
Use the keyword class as a variable name in C++Il C++

In un file di intestazione C di una libreria che sto utilizzando una delle variabili si chiama 'nuova' . Sfortunatamente, sto usando questa libreria in un progetto C++ e l'occorrenza di "nuovo" come un nome di variabile impazzisce nel compilatore. Sto già usando extern "C" {#include < ...>}, ma questo non sembra essere di aiuto in questo senso.

Devo chiedere allo sviluppatore della libreria di cambiare il nome di quella variabile anche se dal suo punto di vista, come sviluppatore C, il codice è assolutamente valido, poiché "nuovo" non è una parola chiave C?

+1

Uno sviluppatore di librerie ha deciso di denominare una variabile globale 'new'? – dreamlax

+1

Penso che questo sia fondamentalmente un duplicato di http://stackoverflow.com/questions/2841204/use-the-keyword-class-as-a-variable-name-in-c – sbi

+0

Accidenti. Come l'hai trovato, sbi? Ho davvero cercato di trovare una risposta prima di postare, ma non ho mai trovato questa domanda. – Florian

risposta

3

È necessario che l'intestazione contenga il nome di questa variabile? Se si sta utilizzando una variabile globale denominata "nuova", ovviamente questo sarebbe un motivo per cui è necessario avere un nome di variabile visibile a livello globale. D'altra parte, se questo è qualcosa come un argomento di funzione chiamato "new", basta cancellare il nome dalla dichiarazione della funzione. Se il nome è un membro di una struttura o unione, modificarlo nel file di intestazione non danneggerà il codice .C finché il codice .C vedrà una definizione "privata" con il nome corrispondente al codice sorgente.

Poiché i file .C devono essere compilati in sintassi C e quindi saranno in grado di gestire la variabile denominata "new", la correzione dei file di intestazione dovrebbe essere un valido work-around.

A lungo termine, sì, si dovrebbe portare questo all'attenzione dello sviluppatore della biblioteca.

Come soluzione finale, in qualche modo hacky, è possibile modificare il file di intestazione da "nuovo" a qualcosa, ad esempio "was_new". E quando compili i file C della libreria usa gli interruttori del compilatore per far rispettare #define new was_new.

+0

So che posso semplicemente cancellare o rinominare quella variabile, come è usato solo in una dichiarazione di funzione: stavo cercando una soluzione che lascia intatto il file di intestazione C della libreria.Mi dispiace se questo non è stato abbastanza chiaro.Grazie per la tua risposta.Infine ho cambiato il file di intestazione, e contatterò gli sviluppatori della libreria su di esso – Florian

0

Se stai modificando un file di intestazione perfettamente fine di una libreria di terze parti, ti consigliamo di fermarti ora. Stai cercando di aggiungere codice C++ a una libreria C se ti ho capito bene, che non funzionerà, C non riconosce la parola chiave "nuova" in quanto è una parola chiave C++.

Invece mi consiglia che:

si crea un progetto separato C++ con un file sorgente (* cpp), aggiungere un # include per il file di intestazione 3a parte, e il collegamento (Google "libs che collegano" ecc.) il file binario della libreria sul progetto.

Mi auguro che aiuta un po ', Evviva

+0

In realtà non voglio modificare il file di intestazione C in quanto è parte di una libreria. Stavo cercando una soluzione che si basa solo sulla modifica del mio Codice sorgente C++. Il problema non è il collegamento delle librerie, ma la compilazione del codice sorgente C++ di mio progetto personale, poiché include ancora le intestazioni C della libreria e quelle, pur essendo C valide, non sono C++ valido. – Florian

7

Prima di includere il file di intestazione, utilizzare il preprocessore di rinominare new:

#define new mynew 
#include <...> 
#undef new 

che permetterà la compilazione di procedere.

Avete effettivamente bisogno di accedere a questa variabile? Se no, allora hai finito. Se lo fai, allora avrete bisogno di assicurare che i file .c per la libreria sono compilati con

-Dnew=mynew 
+0

E quindi sperare che non ci sia già una variabile esistente chiamata 'mynew' :) – dreamlax

+0

Non ho bisogno di accedervi, è solo un parametro in una dichiarazione di funzione. Vedo dove stai andando: Poiché il preprocessore sostituisce "nuovo" con "mynew", il compilatore C++ non vede mai il "nuovo" nel file di intestazione, ma solo il "mynew", che non è una parola chiave C++ e quindi bene da usare – Florian

+0

E in risposta a dreamlax: Questo dovrebbe solo causare un problema, se si usa la parte "-Dnew = mynew". La prima parte dovrebbe essere perfettamente soddisfacente e nel mio caso sufficiente. – Florian

1

Si potrebbe scrivere le proprie funzioni wrapper in C. Tutto ciò che si utilizza che toccherà la biblioteca sarà scritto in C con i file di intestazione amichevoli in C++.Così, invece di:

 
other_lib.h: 
int foo(int new); 

my_app.cxx: 
extern "C" { 
#include <other_lib.h> 
} 

che non compilare, si fa:

 
my_wrap.h: 
#ifdef __cplusplus 
extern "C" { 
#endif 
int my_foo(int); 
#ifdef __cplusplus 
} 
#endif 

my_wrap.c: 
#include <other_lib.h> 
int my_foo(int x) { return foo(x); } 

my_app.cxx: 
#include "my_wrap.h" 

... 

Compile my_wrap.c con un compilatore C, quindi compilare my_app.cxx con il compilatore C++. Ciò consente di creare senza apportare modifiche alla libreria esistente.