Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#7

Re: [C] Deklarationen und Definitionen erkennen

  Alt 2. Jul 2007, 01:48
Zitat von Matze:
int i außerhalb der main-Funktion wäre eine Definition und das entsprechende extern i die zugehörige Deklaration. Sowas geht in Delphi meines Wissens nicht. Aber das ist auch nicht mein Problem, ich hab's nur ergänzend erwähnt.
extern könnte man eher mit einem forward (in Delphi nur für Funktionen und nur in der gleichen Datei - abgesehen von Includes! - gültig) vergleichen. Da in Delphi keine sichtbare Trennung von Compiler und Linker existiert, kann es das in Delphi so auch nicht geben, denn extern besagt ja, daß da irgendwo ein Symbol dieses Namens existiert, was zur Linkzeit dann zur Verfügung stehen wird.

Code:
const int i = 5;       // "sizeof i" liefert 4 Bytes
                        // mir wurde jedoch gesagt, Konstanten belegen keinen Speicher, was nun?
Wer hat das gesagt? Der sizeof-Operator sieht, daß es eine "Variable"/Konstante des Typs int ist und stellt damit nur fest, daß die Größe dann 4 ist. Abgesehen davon belegen Konstanten natürlich auch Speicher, nämlich in der EXE- Das ist aber compilerabhängig und damit eine andere Diskussion.


Code:
enum {A, B, C, D};     // "sizeof A" liefert 4 Bytes, ist im Prinzip aber auch eine Konstante
Was die Voreinstellung ist, da Aufzählungen kompatibel zu Integers sind. Übrigens läßt sich (wie in Delphi auch) die Bittigkeit der Aufzählungstypen auch in C/C++ festlegen.

Stell dir sizeof als Operator vor der nur auf Typen angewendet werden kann. Sobald dort eine Variable oder Konstante (also eine "Instanz" eines Typs) steht, wird implizit die Größe des Typen der "Instanz" ermittelt (s.o.).

Code:
struct komplex {        // Ich hätte auf eine Dekl. getippt, aber "sizeof komplex" liefert 8 Bytes, wieso? o.O
  double Realteil;
  double Imaginaerteil;
};
Bei einem double würde ich 16 Byte gesamt erwarten, aber in jedem Fall haben wir es hier mit soetwas wie einem Typen (wenn auch nicht einem echten typedef) zu tun. Das wäre übrigens etwas wo ich stolpern würde, weil ich das intuitiv als "lokalen Typ" ansehe und somit in der Tat als Deklaration. Als typedef würde es dann zu einem "globalen Typ" geadelt.

Code:
struct komplex my_complex;  // Def. mit 8 Bytes, wie ich's auch gedacht hätte
Was ist denn das für ein Compiler, bei dem double nur 4 Byte breit ist?

Bei Funktionen ist es ganz einfach. Ohne Rumpf ist es eine Deklaration, mit Rumpf eine Definition. Beim Rest ist das alles sehr schwammig, wenn es also für eine Vorlesung ist, am besten an das vorgegebene Material halten. Genau wie Fahrschule
  Mit Zitat antworten Zitat