Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?

Wie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?

DDD
DDDOriginal
2024-10-31 05:38:01295Durchsuche

 How to Force Initialization of a Static Member in C   Without Explicit Referencing?

So erzwingen Sie die Initialisierung eines statischen Mitglieds

Ein häufig übersehenes Verhalten in C ist, dass statische Mitglieder nicht garantiert automatisch initialisiert werden. Man kann davon ausgehen, dass das Mitglied mit der ersten Instanziierung der konkreten Klasse initialisiert wird. Wie aus dem Zitat aus dem Standard hervorgeht, geschieht dies jedoch nur, wenn das statische Element aktiv genutzt wird:

"* Insbesondere findet die Initialisierung (und alle damit verbundenen Nebenwirkungen) eines statischen Datenelements nicht statt es sei denn, das statische Datenelement wird selbst in einer Weise verwendet, die die Existenz der Definition des statischen Datenelements erfordert 🎜>

Intuitiv könnte man erwarten, dass Dummy bei der Instanziierung von Bar initialisiert wird. Dies geschieht jedoch nicht.

Die Frage

<code class="cpp">template <class D>
char register_() {
  return D::get_dummy(); // static function
}

template <class D>
struct Foo {
  static char const dummy;
};

template <class D>
char const Foo<D>::dummy = register_<D>(); // static member initialized with `register_<D>()`

struct Bar : Foo<Bar> {
  static char const get_dummy() { return 42; }
};</code>
Wie kann man die Initialisierung von Dummy erzwingen, ohne dass eine Instanz von Bar oder Foo erforderlich ist? Darüber hinaus sollte die Lösung keine explizite Referenzierung des Mitglieds durch den Benutzer von Foo erfordern.

Potenzielle Lösungen

Lösung 1 (Minimale Auswirkung auf die abgeleitete Klasse)

Die folgende Änderung an der get_dummy()-Methode von Bar erzwingt die Initialisierung von Dummy:

Lösung 2 (Keine Änderung an der abgeleiteten Klasse)

Diese Lösung nutzt Template-Metaprogrammierung:

<code class="cpp">static char const get_dummy() { (void)dummy; return 42; }</code>

Oder es kann ohne Einführung zusätzlicher Mitglieder erfolgen:

Das obige ist der detaillierte Inhalt vonWie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn