40 votes

Est-ce une bonne idée d'envelopper un #include dans un bloc d'espace de nom ?

J'ai un en-tête C qui a été écrit pour être compilé à la fois en C et en C++ (il n'utilise que les fonctionnalités du sous-ensemble commun, et utilise ce sous-ensemble en C++). extern "C" chose).

Le problème est que cet en-tête déclare des choses dans l'espace de nom global. Je préfère éviter cela pour les raisons habituelles. J'ai pensé à faire ceci :

namespace foo {
#include <foo.h>
}

Est-ce une bonne idée de faire ça ? Existe-t-il des alternatives qui n'incluent pas l'édition du fichier d'en-tête ?

44voto

larsmans Points 167484

Non, c'est une mauvaise idée. Avec les déclarations C++, cela risque d'introduire des erreurs de liaison car les identifiants sont déclarés dans le mauvais espace de noms. Avec les déclarations C, cela fonctionne, mais cela peut cacher des conflits entre les identifiants dans l'espace de noms global (ce que vous essayez d'éviter, je suppose) jusqu'au moment de la liaison ; cela n'introduit pas d'erreurs de liaison. vraiment mettre les identifiants dans un espace de nom.

Une meilleure idée serait de mettre vos propres identifiants dans un espace de noms et d'éviter de définir autre chose que main dans celle du monde.

5voto

J'ai fait ce genre de "placer dans un espace de nom" pour <windows.h> à la fin des années 1990.

Bien qu'il ne s'agisse pas d'un support complet : c'était sur le principe d'ajouter un support pour tout ce dont j'avais besoin ensuite, quand j'en avais besoin.

Pour que cela fonctionne, il fallait vérifier quels en-têtes de la bibliothèque C étaient inclus, et s'assurer de les inclure en premier. Cela se résume à 4 de ces en-têtes, IIRC. L'amour de Microsoft pour les macros a rendu les choses difficiles, cependant.

Il est donc possible de le faire en pratique pour les en-têtes C (ou C++ limité au sous-ensemble C-like), mais au prix de la mise à jour de votre wrapper pour chaque nouvelle version du wrappee, ce qui est peu pratique et/ou très coûteux. Sans oublier qu'il est laborieux.

En conclusion, non, ce n'est pas une bonne idée :-)

Je parle en connaissance de cause.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X