Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erzwinge ich die automatische Initialisierung statischer Mitglieder in C?

Wie erzwinge ich die automatische Initialisierung statischer Mitglieder in C?

Susan Sarandon
Susan SarandonOriginal
2024-10-28 05:04:02605Durchsuche

How to Force Initialization of Static Members Automatically in C  ?

So erzwingen Sie die automatische Initialisierung statischer Mitglieder

Statische Mitglieder in C werden nicht automatisch initialisiert, es sei denn, sie werden auf eine Weise verwendet, die dies erfordert Definition zu existieren. Dieses Verhalten kann manchmal unpraktisch sein, insbesondere wenn Sie während der Initialisierung statischer Elemente Nebenwirkungen ausführen möchten.

Betrachten Sie das folgende Beispiel:

<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>();

struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return 42; }
};</code>

In diesem Beispiel würden Sie erwarten, dass es sich um einen Dummy handelt initialisiert, sobald es eine konkrete Instanziierung von Foo gibt, die Sie mit Bar haben. Dies ist jedoch aufgrund des verzögerten Initialisierungsverhaltens statischer Elemente nicht der Fall.

Um die Initialisierung von Dummy ohne eine Instanz von Bar oder Foo zu erzwingen, können Sie eine der folgenden Techniken verwenden:

  • Verwenden Sie eine Vorlagenspezialisierung für die abgeleitete Klasse: Bei dieser Technik wird eine Spezialisierung der Vorlagenklasse für die abgeleitete Klasse erstellt und das statische Mitglied in dieser Spezialisierung manuell initialisiert.
<code class="cpp">template<class D>
struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return (void)dummy; return 42; }
};</code>
  • Verwenden Sie eine Vorlagenstruktur, um die Initialisierung zu erzwingen: Bei dieser Technik wird eine Vorlagenstruktur erstellt, die die Initialisierung des statischen Mitglieds durch eine Mitgliedsvariable der Vorlagenstruktur erzwingt.
<code class="cpp">template<typename T, T> struct value { };

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  typedef value<int&, a> value_user;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;</code>
  • Verwenden Sie eine Template-Struktur mit einer anonymen Enum-Union: Diese Technik ähnelt der vorherigen, verwendet jedoch eine anonyme Union, um die Initialisierung der Statik zu erzwingen Mitglieder.
<code class="cpp">template<typename T, T> struct var { enum { value }; };
typedef char user;

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  static int b; // and this

  // hope you like the syntax!
  user :var<int&, a>::value,
       :var<int&, b>::value;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;

template<typename T>
int HasStatics<T>::b = /* whatever side-effect you want */ 0;</code>

Mit diesen Techniken können Sie die Initialisierung statischer Mitglieder erzwingen, ohne dass ein Benutzereingriff oder eine Änderung der abgeleiteten Klasse erforderlich ist. Die zu verwendende spezifische Technik hängt von Ihren spezifischen Anforderungen und Vorlieben für den Codierungsstil ab.

Das obige ist der detaillierte Inhalt vonWie erzwinge ich die automatische Initialisierung statischer Mitglieder in C?. 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