Ich habe eine Singleton -Registrierung, in der Namen die Funktionszeiger abbilden. Ich habe auch ein Registrar -Objekt, dessen Konstruktor registriert einen Funktionszeiger. Für die Kürze habe ich die Funktionszeiger durch Zeiger auf globale INTs und den assoziativen Container der Registrierung durch einen Vektor ersetzt.
Code: Select all
// registry.h
#include
std::vector &GetRegistry();
< /code>
// registry.cpp
#include "registry.h"
std::vector &GetRegistry() {
static std::vector registry;
return registry;
}
< /code>
// thingadder.h
#include "registry.h"
class ThingAdder {
public:
explicit ThingAdder(int const *thing) {
GetRegistry().push_back(thing);
}
};
< /code>
// things.cpp
#include "thingadder.h"
int g_thing1 = 1;
ThingAdder g_adder1(&g_thing1);
< /code>
// main.cpp
#include "registry.h"
#include
#include
int main() {
std::print("registry size: {}\n", GetRegistry().size());
return 0;
}
Wenn alle Dateien als einzelnes Projekt kompiliert und verknüpft sind, fügt G_ADDER1 's Constructor G_Global1 zur Registrierung hinzu, und das Programm berichtet, dass die Registrierungsgröße 1. Die gemeldete Registrierungsgröße beträgt 0. Es scheint, dass die Globals in Dingen.CPP durch den Link weggelassen wurden. Aber das stimmt auch, wenn er als Monolith gebaut wurde. Ich hätte nicht erwartet, diesen Teil in eine statische Bibliothek zu bündeln, um das Verhalten zu ändern. In der tatsächlichen Bibliothek werden weitere Dateien von Objekten registriert, und
ich möchte nicht, dass jeder Benutzer der Bibliothek für jedes von ihnen einen Verweis auf ein Symbol hinzufügt.