Ist es vernünftig, Umwandlungen in #definierte Konstanten zu integrieren, je nachdem, wie sie verwendet werden sollen?

8

Angenommen, ich habe eine Reihe von nicht-magischen Konstanten, denen in der Header-Datei eines Gyroskop-Moduls gyro.h :

symbolische Namen gegeben wurden %Vor%

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?

%Vor%

Was sind die Vor- und Nachteile dieses Ansatzes?

    
josaphatv 01.02.2015, 17:18
quelle

3 Antworten

3

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.

    
zwol 01.02.2015, 18:05
quelle
3

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.

    
mafso 01.02.2015 17:49
quelle
0

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.

    
Mints97 01.02.2015 17:27
quelle

Tags und Links