URL: https://www.overclockers.at/coding-stuff/c-preprocessor-directives_249354/page_1 - zur Vollversion wechseln!
im folgenden beispiel will ich einen µC- abhängigen check zur compilezeit definieren:
die letzte directive (#else) funktioniert nicht wie erwartet, der code darin wird immer kompiliert. weis jemand woran das liegen könnte?Code: CPP//check if the input pin is an analog pin. return false if it is not. #ifdef __SAM3X8E__ if ((pin_ < A0) || (pin_ > A11)) //Arduino Due: 12 ADC inputs #elif defined __AVR_ATmega2560__ if ((pin_ < A0) || (pin_ > A15)) //Arduino Mega: 16 ADC inputs #elif defined __ESP8266_ESP8266__ if (pin_ != A0) //ESP8266: 1 ADC input #else if ((pin_ < A0) || (pin_ > A5)) #endif return false; return true;
Hm, ein gacher "cout" Test haut bei mir ohne Probleme hin (gcc 7.1)
Wie sieht denn das #define von A0 bis 15 aus?
Und abgesehn davon... warum zur Hölle machst du das?! 
Wenn du einen C++11 fähigen Compiler hast, dann schmeiß jedes einzelne #define aus dem Code raus.
So gut wie alles lässt sich viel schöner durch constexpr und Phantom Types oder ähnlichem abbilden.
die defines kommen nicht von mir. welche macros defined sind hängt ab welches board zur compilezeit in der Arduino-IDE ausgewählt ist.
Code: CPP#define PIN_A0 (54) #define PIN_A1 (55) //[...] #define PIN_A15 (69) static const uint8_t A0 = PIN_A0; //[...] static const uint8_t A15 = PIN_A15;
Aso aso, na gut, is egal... Integer bleibt Integer
Code: C++// some enum class for the selected board enum class Board { SAM3X8E, ATmega2560, ESP8266 }; // compile time check if board has ADC pin constexpr bool hasPin(Board board, int pin) { switch (board) { case Board::SAM3X8E: if (pin < 54 || pin > 65) // use library defines here return false; break; case Board::ATmega2560: if (pin < 54 || pin > 69) return false; break; case Board::ESP8266: if (pin != 0) return false; break; } return true; } int main() { if (hasPin(Board::SAM3X8E, 42)) std::cout << "pin 42 da\n"; else std::cout << "pin 42 ned da\n"; if (hasPin(Board::SAM3X8E, 55)) std::cout << "pin 55 da\n"; else std::cout << "pin 55 ned da\n"; }

korrekt.Zitat aus einem Post von Vincirecht zache Aufgabe

Du solltest trotzdem zur constexpr greifen, die dir einen echten compile time check liefert. Es ist zwar "nur ein if", aber trotzdem mindestens 2 unnötige Instructions wenns der Compiler nicht wegoptimiert.
ich glaube nicht dass ich das mit einer constexpr optimieren kann, der wert von pin_ ist erst zur laufzeit bekannt.
Man müsste sehen was der Compiler genau daraus macht.
Aber im Grunde sollte es funktionieren, da der Wert Board::SAM3X8E und 42 bereits zur Compile Zeit bekannt ist und von keiner Laufzeitevaluierung abhängig ist.
Ein klassische Beispiel für eine constexpr Funktion die Input bekommt ist zb.: die "factorial" Funktion, die ebenso einen Integer bekommt und sich darin sogar selbst rekursiv aufruft.
Siehe hier: http://blog.quasardb.net/demystifying-constexpr/
Zitat aus einem Post von wergorich glaube nicht dass ich das mit einer constexpr optimieren kann, der wert von pin_ ist erst zur laufzeit bekannt.
Code: C++if constexpr (hasPin(Board::SAM3X8E, 42)) std::cout << "pin 42 da\n"; else std::cout << "pin 42 ned da\n";
Äh is ein "Preprogrammer" was anderes als ein "Preprocessor" im Zusammenhang mit µCs
?
aaaaaah natürlich preprocessor... sorry, mein hirn...
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026