J'avais un doute, car j'ai rajouté ce calcul dans un de mes programmes et ça ne plantait pas à la compil, mais ça bloquait le loop du programme.
Je vais donc chercher ailleurs pour trouver l'erreur.
Sinon philippe86220, ce ne sont pas des constantes, je l'avais juste présenté comme ça pour simplifier l'exemple.
J-M-L, oui je l'ai vu en cherchant des infos je vais le modifier avec "const".
J’avais des amis à la maison du coup je ne reviens que maintenant pour expliquer : constexpr indique une valeur constante et connue lors de la compilation. const indique une valeur qui n'est que constante, il n'est pas obligatoire de la connaître lors de la compilation.
Voilà mais personne ne l’utilise (je ne lis aucun code qui l’utilise)…
vous vouliez utiliser : #define coef 0.0014
Il faut donc utiliser constexpr et non const
Vous avez raison sur le fond. constexpr a été introduit avec C++11 (une version majeure en 2011) et les vielles habitudes ont la vie dure
Il faut dire aussi qu’avec notre compilateur (et la majorité des compilateurs) quasiment tout ce qui est calculable à la compilation ou lors de l’optimisation est pré-calculé - c’était des optimisations faciles avant 2011 - et donc pour ce genre de code ça ne change rien.
Une importance théorique est dans l’utilisation dans des contextes qui nécessitent des constantes à la compilation comme les tailles de tableaux, les dimensions de classes, etc., peuvent bénéficier de l’utilisation de constexpr mais comme GCC supporte les tableaux à taille dynamique, pour le programmeur ça ne change pas grand chose.
Un des avantages est plus dans la validation statique du code : L’utilisation de constexpr permet au développeur de fournir une information supplémentaire au compilateur ce qui permet de confirmer certaines propriétés du code à la compilation plutôt qu’à l’exécution ➜ ce qui peut aider à détecter les erreurs dès la phase de compilation plutôt qu’à l’exécution.
En complément de ce qui a été dit plus haut et puisque ça reste dans le cadre du sujet, on trouve encore dans certains codes sur le net par exemple l'utilisation de _BV() :
ici j'écris un blink sur la broche 9 d'un 328p :
#include <util/delay.h>
int main (void)
{
DDRB |= _BV(1); // _BV(1) = Pin 9 du 328p
while (true) {
PORTB |= _BV(1);
_delay_ms(1000);
PORTB &= ~_BV(1);
_delay_ms(1000);
}
return 0;
}
alors que je devrais plutôt écrire entre autre :
#include <util/delay.h>
constexpr byte maPin = (1 << (1)); // Pin 9 du 328p
int main (void)
{
Serial.begin(115200);
DDRB |= maPin;
while (true) {
PORTB |= maPin;
_delay_ms(1000);
PORTB &= ~maPin;
_delay_ms(1000);
}
return 0;
}
Après je me dis que l'on trouve quand même beaucoup de #define dans le domaine de l'électronique. Est-ce qu'on ne pourrait pas adopter le cheminement intellectuel suivant :
De même que l'on oppose à juste titre les c-string aux String pour une meilleure gestion de la mémoire sur les AVR, peut-on opposer les #define aux const et constexpr en gardant constexpr pour les programmes C++ hors programmation des µC (sur les grosses machines et les gros programmes par exemple). Après tout, certes :
Mais je me demande si l'avantage est suffisamment conséquent sur nos petits µC AVR et nos programmes d'autant plus que la plupart des programmeurs continuent a utiliser #define et const plutôt que constexpr est que ça fonctionne ?
Moi même je me surprends parfois à ne pas utiliser constexpr ...
pour les bêtes constantes numériques, non. const fait le job
là où ça devient intéressant c'est quand on couple cela à des fonctions
par exemple compilez ceci sur ESP32
const int formuleCompliquee(int x) {
return x * x + 1/x;
}
void setup() {
Serial.begin(115200);
const int x = formuleCompliquee(0); // calculé au run time
Serial.println(x);
}
void loop() {}
maintenant écrivons la même chose avec des constexpr
constexpr int formuleCompliquee(int x) {
return x * x + 1/x;
}
void setup() {
Serial.begin(115200);
constexpr int x = formuleCompliquee(0); // calculé à la compilation
Serial.println(x);
}
void loop() {}
ce coup ci le compilateur va essayer d'évaluer formuleCompliquee() pour initialiser x à la compilation et va voir le souci directement et refuser de compiler.
sketch.ino: In function 'void setup()':
sketch.ino:8:38: in 'constexpr' expansion of 'formuleCompliquee(0)'
sketch.ino:2:21: error: '(1 / 0)' is not a constant expression
return x * x + 1/x;
~^~
Error during build: exit status 1