Ich muss einen 24-Bit-Datentyp definieren. Ich verwende char[3]
, um den Typ darzustellen. Kann ich typedef char[3]
zu type24
? Ich habe es in einem Codebeispiel versucht. Ich habe typedef char[3] type24;
meine Header-Datei eingefügt. Der Compiler hat sich nicht darüber beschwert. Aber als ich eine Funktion void foo(type24 val) {}
in meiner C-Datei definiert habe, hat sie sich beschwert. Ich möchte in der Lage sein, Funktionen wie type24_to_int32(type24 val)
anstelle von zu definieren type24_to_int32(char value[3])
.
209
type24 foo
, was würde die Größen, Typen und Bedeutungen vonfoo
,*foo
,**foo
,&foo
, und&&foo
? Haben sich die Bedeutung und Rechtmäßigkeit solcher Ausdrücke im Laufe der Jahre geändert?Sie wollen
C-Typ-Deklarationen sind auf diese Weise seltsam. Sie setzen den Typ genau dort ein, wo der Variablenname hingehen würde, wenn Sie eine Variable dieses Typs deklarieren würden.
quelle
Aus der Antwort von R .. :
Benutzer, die nicht sehen, dass es sich um ein Array handelt, schreiben höchstwahrscheinlich Folgendes (was fehlschlägt):
Es wird mit den folgenden Warnungen kompiliert:
Und erzeugt die folgende Ausgabe:
quelle
Arrays können nicht als Funktionsparameter nach Wert in C übergeben werden.
Sie können das Array in eine Struktur einfügen:
und dann als Wert übergeben, aber dann ist es natürlich weniger bequem zu verwenden:
x.byte[0]
stattx[0]
.Ihre Funktion wird
type24_to_int32(char value[3])
tatsächlich nach Zeiger und nicht nach Wert übergeben. Es ist genau gleichbedeutend mittype24_to_int32(char *value)
und3
wird ignoriert.Wenn Sie gerne am Zeiger vorbeikommen, können Sie sich an das Array halten und Folgendes tun:
Dadurch wird ein Zeiger auf ein Array übergeben, kein Zeiger auf das erste Element. Sie verwenden ihn also wie folgt:
Ich bin mir nicht sicher, ob das wirklich ein Gewinn ist, denn wenn Sie versehentlich schreiben
value[1]
, passiert etwas Dummes.quelle
decay
irgendwo erwähnt (und vielleicht darauf hinweist, dass die Situation für die Rückgabe von Arrays schlimmer ist - was überhaupt nicht funktioniert).Um den Array-Typ ordnungsgemäß als Funktionsargument oder Vorlagenparameter zu verwenden, erstellen Sie eine Struktur anstelle eines typedef und fügen Sie
operator[]
der Struktur eine hinzu, damit Sie die Array-ähnliche Funktionalität wie folgt beibehalten können:quelle
char&
nochoperator[]
sind Dinge, die in C.Hier ist ein kurzes Beispiel dafür, warum typedef-Arrays verwirrend inkonsistent sein können. Die anderen Antworten bieten eine Problemumgehung.
Dies erzeugt die Ausgabe
weil type24 als Parameter ein Zeiger ist. (In C werden Arrays immer als Zeiger übergeben.) Der gcc8-Compiler gibt zum Glück standardmäßig eine Warnung aus.
quelle