Angenommen, ich habe eine Reihe von nicht-magischen Konstanten, denen in der Header-Datei eines Gyroskop-Moduls gyro.h
:
In diesem Fall verwenden die Hardware-Abstraktions-Bibliotheken für meine MCU uint32_t
für die Anzahl der Millisekunden. Ist es sinnvoll, statt Platz zuzuordnen und diese als const
zu definieren, Typinformationen im Makro hinzuzufügen?
Was sind die Vor- und Nachteile dieses Ansatzes?
Vielleicht möchten Sie die [U]INT<n>_C
-Makros von stdint.h
stattdessen (Sie müssen möglicherweise nach unten scrollen, wo "Macros for Integer Constant Expressions" steht).
Der Hauptvorteil dieser Makros besteht darin, dass die mit ihnen definierten Konstanten in mehr Kontexten verwendet werden können. Zum Beispiel kann ((uint32_t)1234)
nicht in einem #if
-Ausdruck erscheinen, aber UINT32_C(1234)
kann.
Beachten Sie, dass sich die meisten C-Compiler nicht über Zuweisungen eines konstanten Ausdrucks beschweren, die eine einschränkende Konvertierung beinhalten, es sei denn, die Konvertierung ändert den Wert tatsächlich. Zum Beispiel, gegeben
%Vor% gcc 4.9 und clang 3.5 geben Diagnosen über die Konvertierung only für c
und d
aus, auch wenn ich die Warnungen so hoch wie möglich mache.
Ich halte das für eine gute Sache, vor allem, um die korrekte Signedness zu gewährleisten (zu diesem Zweck wäre jedoch 1000u
genug). Arithmetische Typen sind nicht stark in C eingetippt, daher würde der meiste Code die Semantik nicht ändern, wenn die Makroerweiterung die richtige Signedness hat und gefördert wird (dh nicht kleiner als int
).
Es gibt jedoch statische Analysatoren und Optionen für Compiler, die einige Typüberprüfungen durchführen und bestimmte implizite Konvertierungen verbieten, wo es schön wäre, wenn sich Ihre Konstanten so verhalten würden, als wären sie für die meisten Zwecke Variablen für den Code, der Ihren Header verwendet.
Ja, das ist oft erledigt. Tatsächlich wird der berüchtigte Zeiger NULL
oft folgendermaßen definiert:
#define NULL ((void*)0)
Vorteile : Ihr Makro ist jetzt typsicher, was auch immer die globalen Konstanten sagen.
Nachteile : Wenn Sie es untypisch verwenden möchten, sagen Sie etwa so:
short a = GYRO_SPI_TIMEOUT;
Du brauchst eine Besetzung. Wenn Sie jedoch nicht beabsichtigen, dass solche Nutzungen jemals passieren, kann dies eine gute Sache sein.
Tags und Links c