zu verwenden Ich verwende derzeit statische Const in meinem Code anstelle von "magische Zahlen" wie in "static const" vs "#define" vs "enum" erwähnt.Was anstelle von magischen Zahlen in C
void checkInvalidResponse (uint8_t response)
{
static const uint8_t INVALID_RESP = 0xFF;
if (response == INVALID_RESP)
{
/* Code for invalid response */
}
}
Ich denke jedoch, dass statischen const mit Speicher im kompilierten Code für INVALID_RESP verbrauchen würde. Die Anweisung würde auch in Maschinencode übersetzt werden, der eine LOAD aus dem Speicher gefolgt von dem Vergleich ausführt, anstatt mit einem Wert zu vergleichen, der als Teil der Anweisung bereitgestellt wird. Ist das richtig? Wenn ja, dann wäre diese Lösung in Bezug auf Geschwindigkeit und Speicher nicht optimal, oder?
ich zur Zeit den Code ändern #defines zu verwenden
void checkInvalidResponse (uint8_t response)
{
#define INVALID_RESP 0xFF
if (response == INVALID_RESP)
{
/* Code for invalid response */
}
}
Da jedoch #define keinen Spielraum hat, würde das Verhalten des Cut-and-Paste Aspekts #define über mehr konsistent sein Compiler? Zum Beispiel, wenn INVALID_RESP später neu definiert wird, würde irgendein Code in Zeilen nach der Neudefinition den neuen Wert verwenden?
Ein weiterer Ansatz, den ich untersucht habe, ist die Verwendung von Aufzählungen.
void checkInvalidResponse (uint8_t response)
{
typedef enum
{
INVALID_RESP = 0xFF
} resp_t;
if ((resp_t)response == INVALID_RESP)
{
/* Code for invalid response */
}
}
jedoch die Typumwandlung zu einem ENUM würde mehr Speicher als notwendig (der Prozessor einen 32-Bit (?) Vergleichen, statt eines 8-Bit-Vergleichen tun würde) zuzuteilen.
Was ist die beste Methode, anstatt magische Zahlen im Code zu verwenden?
Sind Sie wirklich besorgt, wenn der Enum-Basistyp länger als 1 Byte ist? –
Kluge Leute schlagen vor, dass es über '' define's überall möglich ist. –
Sie können '' define' 'undefinieren', wo Sie entscheiden, dass Sie mit diesem Wert fertig sind ... – sps