2010-12-03 2 views
5

Je suis en train de modifier un grand projet C++, qui définit dans un de ses en-têtes principaux un FooBar enum. Cette énumération est incluse partout, et malheureusement elle n'est pas espacée. De ce projet, j'aimerais utiliser une bibliothèque C qui, malheureusement, définit également un FooBar enum dans le même espace de noms global.Est-il possible d'ajouter un espace de noms C++ à tous les symboles d'une bibliothèque C?

Je ne peux pas modifier l'implémentation de la bibliothèque, et il est difficile de renommer ou d'espace de noms l'énumération dans le projet C++ car elle est utilisée partout.

Idéalement, j'ajouterais un espace de noms à tous les symboles provenant de la bibliothèque C. J'ai essayé quelque chose comme:

namespace c_library_foo { 
#include <c_library_foo.h> 
} 

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

et qui fonctionne très bien en ce qui concerne la compilation est, mais bien sûr, l'éditeur de liens échoue alors de résoudre les symboles de la bibliothèque que l'espace de noms est pas dans la mise en œuvre.

Répondre

2

Non. La prise en charge des espaces de noms en C++ nécessite un changement de nom. Les symboles émis par la bibliothèque C ne sont pas mutilés (car cela ne se produit pas en C). Vous devez renommer l'enum C++ plutôt que le C enum.

4

Eh bien, j'ai trouvé la solution à propos de 2 après avoir posté cela. L'ajout de "C" externe le fait tomber de l'espace de noms lors de la résolution des symboles, et corrige mon problème. Quelque chose comme:

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

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

Sauf maintenant, votre programme va échouer à lier (ou plutôt, présente un comportement indéfini). –

+1

@Billy: Ce n'est pas indéfini. C'est exactement ce que le C++ inclut dans les en-têtes C. Si vous incluez alors vous pouvez appeler std :: memcmp() très bien. –

+0

@Zan: Parce que C++ définit que la fonction est là. Ce n'est pas parce que cela fonctionne sur * votre * plate-forme que cela ne viole pas la règle de définition unique. –

Questions connexes