2010-05-15 12 views
10

Ho problemi a scrivere codice C++ che utilizza un file di intestazione progettato per un file C. In particolare, il file di intestazione utilizzata una variabile di nome chiamato classe:Utilizzare la classe parola chiave come nome di variabile in C++

int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs); 

Questo funziona in C come classe non viene presa come parola chiave, ma in C++, classe è. Quindi c'è comunque che posso #includere questo file di intestazione in un file C++, o sono sfortunato?

Grazie.

+0

Se il codice non è preparato per essere analizzato da un compilatore C++, prepararsi per ulteriori problemi. Ad esempio, se si tratta di una C lib a cui si desidera eseguire il collegamento, tutte le dichiarazioni devono essere racchiuse in "extern" C "' in modo che il linker sappia che è necessario cercare simboli senza interpolazioni. – sbi

+0

Il compilatore genera ancora un errore quando avvolgo solo #include in una "C" esterna. Dovrei includere il trucco di aaa dentro il tuo? –

+0

Ho appena realizzato che si tratta di un'intestazione Python. Non ho idea di quale intestazione stai usando e a cosa serve, ma conosci http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html? – sbi

risposta

9

provare qualcosa di simile:

#define class class_variable 
// if class is only used in declarations, you can also do 
// #define class 
#include "c.h" 
#undef class 

può causare problemi, ma forse vale la pena un colpo

alternativa (usando Makefile):

python_.hpp: /usr/include/python.h 
    perl -pe 's/\Wclass\W//g' $< > [email protected] 
... 

#include "python_.hpp" 
+0

Ha funzionato ... anche se non ho ancora collegato le librerie, grazie comunque. –

+0

@Leif buona fortuna.Può anche voler controllare manualmente il file pre-elaborato, ma assicurarsi che non siano stati introdotti effetti collaterali indesiderati – Anycorn

+1

Se si utilizzano le intestazioni delle librerie standard, la definizione di una macro con una parola chiave come nome non è consentita (vedere http: // stackoverflow .com/domande/2726204/c-preprocessore-define-ing-a-parola chiave-è-da-standard conformi). C è un po 'più clemente di C++ in questo senso. –

3

È sempre possibile utilizzare #ifdef __cplusplus per creare una dichiarazione specifica per C++ in tale intestazione

+0

Dato che questo fa parte di un repository di codice più grande, probabilmente non dovrei preoccuparmi del file di intestazione. –

3

Sarà necessario modificare l'intestazione di sostituire 'classe' con qualcos'altro, al fine di compilare come C++.

1

In pratica, si' sfortunato. "classe" è una parola riservata , non è possibile utilizzarla come identificatore di variabile.

Immagino che si potrebbe fare i trucchi del preprocessore, come

#define class othername 

Ma in realtà questo è stupido, troppo, perché farò il codice confuso e vi impedisce di utilizzare le classi reali.

Basta mordere il proiettile e rinominare il parametro 'theclass' o qualcosa del genere.

7

Se questa è solo una dichiarazione, i nomi delle variabili non hanno alcuna importanza. Puoi rimuoverli completamente o cambiarli come ti pare. Questo perché la dichiarazione si limita a definire il nome e il tipo di funzione, che è:

int BPY_class_validate(const char *, PyObject *, PyObject *, 
         BPY_class_attr_check*, PyObject **); 

Ma se si desidera che i nomi (per essere un po 'più descrittivo), si può solo buttare una sottolineatura alla fine del quello che hai:

int BPY_class_validate(const char *class_type, PyObject *class_, 
         PyObject *base_class, BPY_class_attr_check* class_attrs, 
         PyObject **py_class_attrs); 

Questo non infrangerà nessun altro codice.

Problemi correlati