2 votes

Inclure une fonction globale dans un espace de noms en C++

Existe-t-il un moyen d'inclure des fonctions globales (provenant par exemple d'une bibliothèque dont je ne suis pas autorisé à modifier le code) dans la portée d'un espace de noms et de pouvoir les utiliser ?

J'ai deux fonctions :

base64_decode()
base64_encode()

dans deux dossiers : Base64.cpp Base64.h .

(évidemment) lorsqu'il s'agit d'inclure Base64.h dans mon Extensions les déclarations de fonctions sont disponibles, mais l'éditeur de liens ne peut pas trouver les définitions (dans l'espace de noms Base64.cpp ) parce qu'ils sont maintenant inclus dans mon espace de noms. Exemple :

namespace Extensions {
    #include "Base64.h"
}

Existe-t-il un moyen d'avoir à la fois l'implémentation et la déclaration des deux fonctions à l'intérieur de l'espace de noms ? sans modifier le code original et sans #include ingurgiter Base64.cpp ?

8voto

Maxim Yegorushkin Points 29380

Un moyen courant :

#include "Base64.h"

namespace Extensions {

using ::base64_decode;
using ::base64_encode;

}

static_assert(sizeof(&Extensions::base64_decode) > 0, "");
static_assert(sizeof(&Extensions::base64_encode) > 0, "");

1voto

Martin Bonner Points 91

Si vous souhaitez simplement obtenir les fonctions en l'espace de noms, puis Maxim Egorushkin L'excellente réponse de l'auteur est la voie à suivre.

Cependant, il arrive que vous ayez besoin d'obtenir la fonction sortir de l'espace de noms global (parce qu'elle entre en conflit avec une autre fonction du même nom). Dans ce cas, vous devrez utiliser

namespace Extensions {
    #include "Base64.h"
}

puis utiliser des astuces spécifiques à la plate-forme pour renommer les symboles dans la bibliothèque afin que l'éditeur de liens puisse les trouver. Voir cette réponse pour Linux.

Il semble que toutes les options permettant de renommer les symboles sous Windows s'appliquent aux DLL. Vous devrez trouver ce qui est à l'origine de la confusion des noms.

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