const oder #define?

Hallo,

wann verwendet Ihr const, wann #define und warum?

Gruß Chris

Ist eine kleine Glaubenssache. const x ist halt typensicher, define sind lediglich Textergänzung die vorm kompilieren ersetzt werden.

Wann immer es geht: const.

Define nur wenn es keine bessere Alternative gibt. Wer Angst hat, daß const Speicher verbrät kann ja stattdessen enums verwenden. Die werden von Compiler zur Compilezeit ausgewertet.

Glaubenssache ist eher ob man Macros vs. Templates verwendet.

Ein Grund für Define ist falls man die Macros "von aussen setzen" will, d.h. dem Compiler mitgeben. Macht aber in der Arduino Welt praktisch keiner.

Grund für const: Typsicherheit.

Ob der Speicherverbrauch mit const oder mit Macros kleiner wird kann man pauschal nicht sagen. Die Macroverfechter die behaupten, daß Macros IMMER geringeren Speicherverbrauch nach sich ziehen haben entweder nie gemessen oder keine Ahnung.

Im Zweifelsfall hilft immer nur Ausprobieren: http://gcc.godbolt.org/

Ich für meinen Teil verwende immer erst einmal const und erst wenn es gar nicht mehr anders geht nehme ich Macros / Templates.

in simples const verbraucht NIEMALS mehr Speicherplatz als ein #define.
Der Compiler kann auch rechnen.
Dieses Beispiel verbraucht nicht mehr Platz, als wenn ich es selbst ausrechne, ist aber lesbarer und wartungsfreundlicher:

const unsigned long SECOND = 1000; // millis per second
const unsigned long MINUTE = 60 * SECOND; // millis per minute
.
.
const unsigned long INTERVAL_backupBattery = 5 * MINUTE;

olf2012:
..als wenn ich es selbst ausrechne..

Was meinst Du damit?

Gruß Chris

const unsigned long SECOND = 1000; // millis per second
const unsigned long MINUTE = 60000; // millis per minute

statt

const unsigned long SECOND = 1000; // millis per second
const unsigned long MINUTE = 60 * SECOND; // millis per minute

Ist in diesem Fall zwar eine einfache Rechnung aber bei komplexeren Rechnungen ist ein ausrechnen lassen bessere verständlich weil man versteht woher die Zahl kommt bzw einfacher da nur 1 Wert zu ändern ist. Im Beispiel nur SECOND und nicht beide.

Grüße Uwe

Achtung mit #define !
arduino code :

#define FOO 4+1

void setup() {                
    Serial.begin(9600);
    int bar = 2 * FOO;
    Serial.print("Erwartete Ergebnis : 10, aber : ");
    Serial.println(bar);

}

void loop() {
    delay(1000);
}

PC code :

#define FOO 4+1

#include <stdio.h>
#include <stdlib.h>

int main ( void )
{
    int bar = 2 * FOO;
    printf("Erwartete Ergebnis : 10, aber : %d\n", bar);
    
    return 0;
}

Der Compiler alle #define ersetzt in allen Code VOR der Kompilierung !
Archtung Prioritäten von Operatoren :
#define FOO 4+1 -> #define FOO (4+1)

Entschuldigen Sie mich für mein schlechtes Deutsch, ich einen Monat in Deutschland gelebt, und ich muss Deutsche Sprache lernen.