2010-05-15 8 views
10

Tengo problemas para escribir código C++ que utiliza un archivo de encabezado diseñado para un archivo C. En particular, el archivo de cabecera utiliza un nombre de variable clase llamada:Utilice la clase de palabra clave como nombre de variable en C++

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

Esto funciona en C como clase no se toma como una palabra clave, pero en C++, la clase es. Entonces, de todos modos, ¿puedo #incluir este archivo de encabezado en un archivo C++, o no tengo suerte?

Gracias.

+0

Si ese código no está preparado para ser analizado por un compilador de C++, prepárese para más problemas. Por ejemplo, si esta es una lib de C con la que desea establecer un enlace, todas las declaraciones deben estar envueltas en 'extern' C "' para que el enlazador sepa que necesita buscar símbolos no marcados. – sbi

+0

El compilador aún arroja un ajuste cuando simplemente envuelvo el #include en una "C" externa. ¿Debería incluir el truco de aaa dentro del tuyo? –

+0

Me acabo de dar cuenta de que este es un encabezado de Python. No tengo idea de qué encabezado está usando y para qué se usa, pero ¿conoce http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html? – sbi

Respuesta

9

intentar algo como esto:

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

que puede causar problemas, pero tal vez digno de un tiro

alternativa (usando Makefile):

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

#include "python_.hpp" 
+0

Funcionó ... aunque todavía no he vinculado las bibliotecas, gracias. –

+0

@Leif buena suerte.También puede querer inspeccionar manualmente el archivo preprocesado, solo asegúrese de que no haya ningún efecto secundario no deseado. – Anycorn

+1

Si usa cualquiera de los encabezados de biblioteca estándar, no se permite definir una macro con una palabra clave como su nombre (consulte http: // stackoverflow .com/questions/2726204/c-preprocessor-define-ing-a-keyword-es-cumple-estándares-conforme). C es un poco más indulgente que C++ en este sentido. –

3

Siempre se puede usar #ifdef __cplusplus para crear una declaración específica para C++ en esa cabecera

+0

Como esto es parte de un repositorio de código más grande, probablemente no debería estar rebuscando en el archivo de encabezado. –

3

Usted tendrá que modificar el encabezado para reemplazar la 'clase' con otra cosa con el fin de compilar como C++.

1

En la práctica, se' Re de la suerte. "clase" es una palabra reservada , no puede usarla como identificador de variable.

supongo que se podría hacer trucos del preprocesador, como

#define class othername 

Pero en realidad eso es tonto, también, porque va a hacer que el código confuso y le impide el uso de clases reales.

Solo pica la viñeta y cambia el nombre del parámetro 'theclass' o algo así.

7

Si solo se trata de una declaración, los nombres de las variables no importan en absoluto. Puedes eliminarlos por completo o cambiarlos como quieras. Esto se debe a que la declaración se limita a definir el nombre y el tipo de la función, que es:

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

Pero si desea que los nombres (a ser un poco más descriptivo), sólo puede tirar un guión al final de lo que tiene:

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

Esto no romperá ningún otro código.

Cuestiones relacionadas