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

J’ai un en-tête C qui a été écrit pour comstackr à la fois en C et en C ++ (il n’utilise que des entités du sous-ensemble commun et utilise cette chose extern "C" ).

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

 namespace foo { #include  } 

Est-ce une bonne idée? Ai-je des alternatives qui n’incluent pas l’édition du fichier d’en-tête?

Non, c’est une mauvaise idée. Avec les déclarations C ++, il est probable que des erreurs de l’éditeur de liens apparaissent lors de la déclaration des identificateurs dans le mauvais espace de noms. Avec les déclarations C, cela fonctionne, mais il peut cacher des conflits entre les identifiants de l’espace de noms global (que vous tentiez d’éviter, je suppose) jusqu’au moment du lien; il ne met pas vraiment les identifiants dans un espace de noms.

Une meilleure idée serait de mettre vos propres identifiants dans un espace de noms et d’éviter de définir autre chose que le main dans le global.

J’ai fait ce genre de “placer dans un espace de noms” pour à la fin des années 1990.

Bien que ce ne soit pas avec un support complet: c’était sur le principe d’append un support pour le prochain dont j’avais besoin quand j’en avais besoin.

La clé pour faire ce travail était de vérifier quels en-têtes de bibliothèque C étaient inclus, et assurez-vous de les inclure en premier. Il se résumait à 4 tels en-têtes, IIRC. L’amour de Microsoft pour les macros a rendu les choses difficiles, cependant.

Cela peut donc être fait en pratique pour les en-têtes C (ou C ++ limités au sous-ensemble C-like), mais au prix de la mise à jour de votre wrapper pour chaque nouvelle version de wrappee, ce qui est peu pratique et / ou très coûteux. Sans parler de laborieux.

En conclusion, non, ce n’est pas une bonne idée. 🙂

Parlant d’expérience