C++ — Änderungen 7831 → 7959

Zeile 174: Zeile 174:
 
extern "C" void foobar(int i, double* d);</cpp>
 
extern "C" void foobar(int i, double* d);</cpp>
 
Der Linker würde 2 Funktionen mit dem Namen 'foobar' finden und könnte das ganze nicht mehr linken und auch nicht feststellen welche Funktion die Aufrufer jeweils meinen.
 
Der Linker würde 2 Funktionen mit dem Namen 'foobar' finden und könnte das ganze nicht mehr linken und auch nicht feststellen welche Funktion die Aufrufer jeweils meinen.
−
 
−
=== designated initializers ===
 
−
Das Problem hier ist, dass C++ im Gegensatz zu C keine ''designated initializers'' (siehe [http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html GCC Manual] für eine Erklärung) unterstützt, beispielsweise wird der Code
 
−
<cpp>
 
−
struct
 
−
{
 
−
  uint16_t limit;
 
−
  void* pointer;
 
−
} __attribute__((packed)) gdtp =
 
−
{
 
−
  .limit = GDT_ENTRIES * 8 - 1,
 
−
  .pointer = gdt,
 
−
};
 
−
</cpp>
 
−
beim Kompilieren eine Fehlermeldung namens ''expected primary-expression before ‘.’ token'' ausgeben.
 
−
 
−
Man kann allerdings den gleichen Effekt entweder durch Weglassen des Feldnamens erreichen (dann muss die Initialisierung in der Reihenfolge wie die Definition des Strukturtyps sein):
 
−
<cpp>
 
−
struct
 
−
{
 
−
  uint16_t limit;
 
−
  void* pointer;
 
−
} __attribute__((packed)) gdtp =
 
−
{
 
−
  GDT_ENTRIES * 8 - 1,
 
−
  gdt,
 
−
};
 
−
</cpp>
 
−
Die andere Möglichkeit ist einen Konstruktor für die Struktur zu definieren - dafür muss aber die Struktur benannt werden:
 
−
<cpp>
 
−
struct gdt_register
 
−
{
 
−
  uint16_t limit;
 
−
  void* pointer;
 
−
 
−
  gdt_register(uint16_t _limit,
 
−
              void*    _pointer)
 
−
    : limit(_limit), pointer(_pointer){}
 
−
} __attribute__((packed));
 
−
 
−
gdt_register gdtp(GDT_ENTRIES * 8 - 1, gdt);
 
−
</cpp>
 
  
 
== Siehe auch ==
 
== Siehe auch ==