2010-12-03 17 views
5

Estoy modificando un gran proyecto de C++, que define en uno de sus encabezados principales un enum FooBar. Esa enumeración se incluye en todas partes, y lamentablemente no es espacio de nombres.¿Es posible agregar un espacio de nombres C++ a todos los símbolos de una biblioteca C?

De ese proyecto me gustaría usar una biblioteca C, que desafortunadamente también define un enum FooBar en el mismo espacio de nombres global.

No puedo cambiar la implementación de la biblioteca, y es difícil cambiar el nombre o el espacio de nombres de la enumeración en el proyecto C++ porque se usa en todas partes.

Así que, idealmente, agregaría un espacio de nombres a todos los símbolos procedentes de la biblioteca C. He intentado algo así como:

namespace c_library_foo { 
#include <c_library_foo.h> 
} 

... 
c_library_foo::c_library_function() 
... 

y que trabaja muy bien en lo que se refiere a la compilación, pero por supuesto el enlazador entonces no resuelve los símbolos de la biblioteca como espacio de nombre no está en la aplicación.

Respuesta

2

No. El soporte de espacios de nombres en C++ requiere el cambio de nombre. Los símbolos emitidos por la biblioteca C no tienen nombre destrozado (porque eso no ocurre en C). Necesita cambiar el nombre de la enumeración de C++ en lugar de C enum.

4

Bueno, encontré la solución unos 2 segundos después de publicar esto. Al agregar extern "C", deja caer el espacio de nombres al resolver los símbolos y soluciona mi problema. Algo como:

namespace c_library_foo { 
extern "C" { 
#include <c_library_foo.h> 
} 
} 

... 
c_library_foo::c_library_function() 
... 
+0

Excepto que ahora su programa no va a poder enlazar (O más bien, muestra un comportamiento indefinido). –

+1

@Billy: Esto no está indefinido. Esto es exactamente lo que C++ incluye hacer con los encabezados C. Si incluye , puede llamar a std :: memcmp() simplemente. –

+0

@Zan: Porque C++ define que la función esté allí. El hecho de que funcione en * su * plataforma no significa que no esté rompiendo la regla de una definición. –

Cuestiones relacionadas