Frage zu Datentype in einem #define, was ist "int" für den Compiler

Moin,
der Forumteilnehmer "schittl" hat mich auf eine Warning beim übersetzen meiner Lib aufmerksam gemacht, auf die ich auch auf anhieb keine Lösung habe, außer jeden einzelnen Wert auf unsigned long (uint32_t) zu casten.

Folgendes erzeugt eine Warning:

#define init_time (1000*1000*1000)
const PROGMEM uint32_t   test  = (uint32_t)(init_time);

warning: integer overflow in expression [-Woverflow]

Folgendes funktioniert:

#define init_time (1000000000)
const PROGMEM uint32_t   test  = (uint32_t)(init_time);

Normalerweise setzt der Compiler Konstanten doch ein bzw. löst die Multiplikation und setzt anstelle dieser eine Konstante ein (Code Optimierung)

Was läuft hier schief oder wird der Arduinocode nicht weiter optimiert?

So sollte es gehen...

#define init_time (1000UL*1000UL*1000UL)
const PROGMEM uint32_t   test  =  init_time ;

Danke, das klappt

Ja, er multipliziert. Und der Standard-Datentyp ist immer int. Auch im Prä-Prozessor. Oder es kann gut sein, dass die dass erst durch den Compiler aus-multipliziert wird und deshalb die Warnung durch den generiert wird.