C++ — Änderungen 11307 → 11519

Zeile 26: Zeile 26:
  
 
=== g++ ===
 
=== g++ ===
−
<cpp>
+
<syntaxhighlight lang="cpp">
 
// Lizenz: public domain
 
// Lizenz: public domain
  
Zeile 34: Zeile 34:
 
   // Programm/Kernel beenden
 
   // Programm/Kernel beenden
 
}
 
}
−
</cpp>
+
</syntaxhighlight>
  
 
== globale/statische Objekte ==
 
== globale/statische Objekte ==
Zeile 47: Zeile 47:
 
In neueren Version von GCC wurde die Sektion .ctors* in .init_array umbenannt und muss gegebenenfalls im Linkerscript geändert werden.
 
In neueren Version von GCC wurde die Sektion .ctors* in .init_array umbenannt und muss gegebenenfalls im Linkerscript geändert werden.
  
−
<cpp>
+
<syntaxhighlight lang="cpp">
 
// Lizenz: public domain
 
// Lizenz: public domain
  
Zeile 64: Zeile 64:
 
     (*i)();
 
     (*i)();
 
}
 
}
−
</cpp>
+
</syntaxhighlight>
  
 
Diese Funktion muss explizit aufgerufen werden bevor globale/statische Objekte verwendet werden. Dies kann beispielsweise im [[C++#Startup-Code | Startup-Code]] geschehen.
 
Diese Funktion muss explizit aufgerufen werden bevor globale/statische Objekte verwendet werden. Dies kann beispielsweise im [[C++#Startup-Code | Startup-Code]] geschehen.
Zeile 76: Zeile 76:
 
Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen:
 
Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen:
  
−
<cpp>
+
<syntaxhighlight lang="cpp">
 
  int __cxa_atexit(void (* f)(void *), void *p, void *d);
 
  int __cxa_atexit(void (* f)(void *), void *p, void *d);
−
</cpp>
+
</syntaxhighlight>
  
 
f ist ein Funktionszeiger zu einem Destruktor, p der Parameter, der dem Destruktor übergeben werden soll und d ist das sog. "home DSO" (DSO = dynamic shared object).  Diese Funktion sollte alle drei Parameter speichern und bei Erfolg 0, andernfalls nicht 0 zurückgeben. Wenn der Kernel/das Programm dann beendet wird, sollte man die Funktion
 
f ist ein Funktionszeiger zu einem Destruktor, p der Parameter, der dem Destruktor übergeben werden soll und d ist das sog. "home DSO" (DSO = dynamic shared object).  Diese Funktion sollte alle drei Parameter speichern und bei Erfolg 0, andernfalls nicht 0 zurückgeben. Wenn der Kernel/das Programm dann beendet wird, sollte man die Funktion
  
−
<cpp>
+
<syntaxhighlight lang="cpp">
 
  void __cxa_finalize(void *d);
 
  void __cxa_finalize(void *d);
−
</cpp>
+
</syntaxhighlight>
  
 
mit d = 0 aufrufen, um alle mit __cxa_atexit registrierten Funktionen mit passenden Paramtern aufzurufen. Die registrierten Funktionen müssen in umgekehrter Reihenfolge aufgerugen werden.
 
mit d = 0 aufrufen, um alle mit __cxa_atexit registrierten Funktionen mit passenden Paramtern aufzurufen. Die registrierten Funktionen müssen in umgekehrter Reihenfolge aufgerugen werden.
 
Außerdem muss man ein Symbol namens __dso_handle bereitstellen. Es wird allerdings nur die Adresse des Symbols verwendet um ein DSO zu identifizieren und um __cxa_atexit aufzurufen.
 
Außerdem muss man ein Symbol namens __dso_handle bereitstellen. Es wird allerdings nur die Adresse des Symbols verwendet um ein DSO zu identifizieren und um __cxa_atexit aufzurufen.
  
−
<cpp>
+
<syntaxhighlight lang="cpp">
 
// Lizenz: public domain
 
// Lizenz: public domain
  
Zeile 128: Zeile 128:
 
   }
 
   }
 
}
 
}
−
</cpp>
+
</syntaxhighlight>
  
 
== new/delete ==
 
== new/delete ==
Zeile 139: Zeile 139:
  
 
Eine einfache Implementation ist z.B.:
 
Eine einfache Implementation ist z.B.:
−
<cpp>
+
<syntaxhighlight lang="cpp">
 
void *operator new( size_t size )
 
void *operator new( size_t size )
 
{
 
{
Zeile 159: Zeile 159:
 
   kfree( obj );
 
   kfree( obj );
 
}
 
}
−
</cpp>
+
</syntaxhighlight>
  
 
== RTTI ==
 
== RTTI ==