Rebonjour,
Envoyé par
Josiane22
Tu pourrais m'expliquer un peu ce que fais cette ligne?
Laquelle ? Celle-là:
static double __attribute__((__unused__)) truc;
Envoyé par
Josiane22
De ce que j'ai compris, ca veux dire en gros "déclare truc mais attention, je sais que truc ne sera pas toujours utilisé. Donc ne me le signale pas à chaque fois...". c'est ça?
C'est exactement ça, voir ici
Envoyé par
Josiane22
Si oui, quelle différence entre ça et une option de compilation qui ne m'afficherais pas les warning.
La différence c'est que l'attribut ne s'applique qu'a la variable en question, et ne désactive le warning que pour ces variables, pas pour les variables qui ne sont pas marquées avec cet attribut. L'option de compilation, elle, désactivera ce warning pour toutes les variables.
Envoyé par
Josiane22
J'ai un peu peur de cacher mon problème au lieu de le supprimer
Toute la question est là, est-ce un problème ? Mais il me semble que ton but principal (compte tenu des contraintes que tu as) est justement de masquer ce problème pour pouvoir te concentrer sur les autres.
Pour revenir sur le pourquoi le programmeur a écrit un tel code:
1 2
| static double truc;
#define TOTO(a) ((truc=(a)) == 0.0 ? 0.0 : 2*truc) |
Ça évite la répétition des effets de bords (voir cette FAQ C).
Note que pour ce problème, g++ offre une extension:
#define TOTO(a) ({ double truc=(a); truc == 0.0 ? 0.0 : 2*truc; })
(Voir ici.)
Cependant, la solution C++ à ce problème est d'utiliser des fonctions inline:
inline double TOTO(double a) {return a == 0.0 ? 0.0 : 2*a;}
(Les macros sont la solution C pour optimiser une « fonction » en supprimant l'appel de fonction, la solution C++ pour ça, c'est les fonctions inline.)
Cette solution, en plus d'être du C++, me paraît compatible avec ta contrainte « je dois apporter un minimum de changement » (après, ça dépend de la quantité de telles macros).
Partager