Frage

Ich habe eine Funktion, die ein unsigned long * und Bedürfnisse nimmt es auf eine externe Bibliothek übergeben, die einen unsigned int nimmt * und auf dieser Plattform unsigned int / sind lang die gleiche Größe.

void UpdateVar(unsigned long* var) {
   // this function will change the value at the address of var
   ExternalLibAtomicUpdateVar((unsigned int*)var); // lib atomically updates variable
}

Diese erzeugen eine Warnung sagen, dass seine strenge Aliasing Regeln zu brechen. Gibt es Workarounds?

Danke

Edit: Ich entschuldige mich für nicht klar zu sein. Der Code ist ein atomarer Update so die Bibliothek gehen um zu speichern, es ist keine Option. Ich konnte bis zur Montage fallen nach unten, aber ich möchte dies in C ++ tun.

War es hilfreich?

Lösung

void UpdateVar(unsigned long* var) {
   unsigned int x = static_cast<unsigned int>(*var);
   ExternalLibUpdateVar(&x);
   *var = static_cast<unsigned long>(x);
}

Andere Tipps

Dies sollte funktionieren:

void UpdateVar(unsigned long* var) {
   // this function will change the value at the address of var
   ExternalLibUpdateVar(reinterpret_cast<unsigned int*>(var));
}

Nichts in den C Standard Mandate dass int und long müssen die gleiche Größe haben; weiter, auch wenn sie die gleiche Größe, nichts in den Standard-Mandate tun haben, dass sie die gleiche Darstellung (unter anderem haben, könnten sie nicht kompatible Kombinationen von Füllbits und Trap-Darstellungen aufweisen, so dass nicht dienen könnte zwischen den beiden Typen Aliasing jeder nützlicher Zweck).

Die Autoren der Norm wollten nicht Kraft Implementierer Plattformen ausgerichtet, wo zwischen int und long Aliasing wäre zwecklos solche Aliasing zu erkennen. Sie wollten auch keine Regeln schreiben, die auf einigen Plattformen anwendbar wäre (solche, bei denen Aliasing einen Zweck dienen würde), andere aber nicht (in denen es würde nicht). Stattdessen sie dachte, dass Compiler schreiben Menschen Qualität in Fällen Aliasing zu erkennen versuchen würde, wo es war nützlich.

Die Möglichkeit, Zeiger zu verwenden, um einen 32-Bit-Typen Lese- und Schreibwerten eines anderen 32-Bit-Typs, der die gleiche Darstellung hat, ist klar nützlich, vor allem, wenn APIs sind gespalten darüber, welche Art sie erwarten. Wenn einige alltäglich APIs auf einer Plattform Verwendung int* für 32-Bit-Werte und andere long* verwenden, wird ein Qualität Allzweck Implementierung für diese Plattform muß die Daten von jeder Art erlauben Zeiger des andere zu zugegriffen werden.

Leider jedoch sind die Autoren von einigen Compilern mehr daran interessiert, schnell eine bestimmte Untergruppe von Programmen in der Verarbeitung als in zweckmäßigerweise eine größere Teilmenge der Verarbeitungsprogramme, und sich nicht darauf verlassen kann nützlich Code zu generieren, wenn es um den Austausch von Daten notwendig ist, zwischen APIs, die die gleiche Datendarstellung, aber unterschiedliche Typen genannt, wenn man nicht vollständig verwenden Aliasing Analyse deaktiviert. Natürlich ist, wenn man Dialekte von C-Targeting, die für allgemeine Anwendungen auf Mikrocontrollern geeignet sind, sind solche Fragen keine Rolle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top