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