Ich versuche, eine C-Bibliothek in C++ zu wickeln, um es zu einer modernen, hochwertigen und idiomatischen C++ - Bibliothek zu machen. Was ich tun möchte, ist, die C-Objekte vollständig undurchsichtig und/oder direkt aus dem C++ - Code nicht verfügbar zu machen und sie durch höhere Alternativen zu ersetzen.Wie verschmutzt man den globalen Namensraum nicht mit Deklarationen eines C-Headers?
Das Problem, mit dem ich konfrontiert bin, ist einfach: Ich möchte den C-Header nur in die C++ - Quelle, so dass die C++ - Header enthalten auch die C-Header-Deklarationen nicht enthalten, das heißt, es gewonnen hat Verschmutze den globalen Namensraum nicht.
Aber es sieht aus wie die richtige Trennung der Header-und Quelldateien erlaubt mir nicht, dies zu tun. Hier ist eine sehr viel dummified Version meines Problems, werden die Kommentare sagen Sie den Rest:
my_header.h:
typedef enum
{
my_Consts_ALPHA = /* some special value */,
my_Consts_BETA = /* other special value */,
} my_Consts;
typedef struct
{
// members...
} my_Type;
void
my_Type_method(my_Type *const,
my_Enum);
my_header.hpp:
namespace my
{
enum class Consts; // <-- This header is missing the constant values of
// this enum, because its values are defined by
// the C header :(
class Type : public my_Type // <-- The super struct is coming from the
// C header, but I don't want to include
// that header here :(
{
public:
void
method(Consts constant);
};
}
my_source.cpp:
extern "C"
{
#include "my_header.h"
}
#include "my_header.hpp"
namespace my
{
enum class Consts
{
ALPHA = my_Consts_ALPHA,
BETA = my_Consts_BETA,
};
void
Type::method(Consts constant)
{
my_Type_method(static_cast<my_Type *const>(this),
static_cast<my_Consts>(constant));
}
}
Also meine Fragen sind: bin ich etwas sehr offensichtlich hier fehlt? Ist das überhaupt möglich? Gibt es einen Trick, den ich nicht kenne?
' Namespace m00 { #include "myheader.h"} '(ja, das ist teilweise sarkastisch) –
Wie wäre es mit dem [pimpl idiom] (https://en.wikipedia.org/wiki/Opaque_pointer)? –
Sie versuchen, Typen aus Ihrer c-Bibliothek in der Schnittstelle Ihrer cpp-Bibliothek wiederzuverwenden. Solange das der Fall ist, können Sie diese Typen natürlich nicht verbergen. – MikeMB