Ich versuche diese Struktur zu haben, die direkt die Daten enthält, an denen ich interessiert bin, sizeof(foo) == 6+the rest
, nicht sizeof(foo) == sizeof(void*)+the rest
. Allerdings kann ich keine Möglichkeit finden, eine Struktur vom Typ foo
mit einem data_t
zu initialisieren. Ich denke, vielleicht könnte ich den const
Modifikator aus dem Feld entfernen und memcpy
verwenden, aber ich mag die zusätzliche Sicherheit und Klarheit.
Ich erhalte keine Kompilierungsfehler, aber wenn ich den Code ausführe, bekomme ich
%Vor%damit die Kopie nicht richtig funktioniert, denke ich.
Dies ist für ein Arduino (oder ähnliches Gerät), also versuche ich, es auf sehr portablen Code zu halten.
Ist das nicht möglich?
BEARBEITEN: Das Entfernen des const
Modifikators im data_t
Feld scheint nicht zu helfen.
Es ist unmöglich, dies standardkonform zu tun.
Da% const
ist, muss const char data[6];
initialisiert werden, um verwendbar zu sein, und es kann nur statisch initialisiert werden (statische Objekte ohne Initialisierer werden automatisch auf Null gesetzt), mit einem String-Literal oder mit einer geschweiften Initialisierungsliste . Sie können es nicht mit einem Zeiger oder einem anderen Array initialisieren.
Wenn ich Sie wäre, würde ich das const
-Dokument loswerden, dass .data
nach der Initialisierung nicht geändert werden sollte, und dann memcpy
verwenden, um es zu initialisieren.
( const
auf Struktur-Mitgliedern funktioniert meiner Meinung nach nicht sehr gut. Es verhindert effektiv, dass Sie Initialisierungsfunktionen haben können, und während C ++ das Problem ein wenig umgeht, indem es spezielle Sprachunterstützung für seinen Konstruktor hat Funktionen, bleibt das Problem bestehen, wenn die const
-Member Arrays sind).
Dies ist möglich, für einige Kosten >=0
.
Einige Compiler (z. B. clang) sind sogar in der Lage, das redundante Kopieren zu optimieren (von x
nach d.c
und dann von d
nach foo.data
⇒ von x
direkt nach foo.data
). Andere (gcc ich schaue dich an) scheinen das nicht zu erreichen.
Wenn Sie Zeiger auf data_t
und nicht auf direkte char
Zeiger übergeben, benötigen Sie diesen zusätzlichen memcpy-Schritt nicht. OTOH Um Zugriff auf das Array char
in foo
zu haben, benötigen Sie eine weitere Stufe des Mitgliederzugriffs ( .data.c
anstatt nur .data
; dies hat jedoch keine Laufzeitkosten).
Eehh Ich habe irgendwie eine Lösung gefunden. Es ist ein bisschen albern, aber was auch immer
%Vor% Es gibt keine Warnung und ich kann die Const auf dem Feld halten. Ich weiß, es ist technisch nicht in Ordnung, memcpy
auf ein Feld zu setzen, das als const betrachtet wird, aber in diesem Fall mache ich es nur einmal in der Funktion, die die Struktur initialisiert. Es scheint auch, dass das Array kein Zeiger ist, sondern tatsächlich vollständig innerhalb der foo
struct (kein Zeiger, yay)
Ich würde immer noch gerne Feedback, wenn jemand bereit ist zu geben.
Tags und Links c