OVH Cloud OVH Cloud

#define conditionnel

16 réponses
Avatar
ben_cal
Bonjour,

je travaille en ce moment sur une lib qui peut avoir 2 versions (une
float et une double suivant que REAL est defini a float ou a double).
J'aimerais maintenant que tous les #define EPSILON et autres prennent en
compte la valeur de REAL. Soit un truc du genre:

#if REAL == float
#define EPSILON = 1e-4
#else
#define EPSILON = 1e-6

Si qq1 parmi vous a une solution propre, merci d'avance.

Benoit

6 réponses

1 2
Avatar
ben_cal
Loïc Joly wrote:


Euh, il me semblait que tu avais déjà eu de bonnes solutions,
qu'est-ce qui ne te conviens pas avec ?



A moins que j'ai rate un truc, mais les solutions proposees suppposent
que ce soit moi qui definisse REAL. Malheureusement ce n'est pas le cas
car il est defini dans les options de compilation...
Donc, je me retrouve avec un REAL deja defini et utilise partout dans le
code.
Pour resumer, on doit pouvoir recompiler toutes les libs uniquement en
ne changeant que cette option de compilation...
Ya t'il un truc que j'aurais manque?

Benoit

Avatar
Florent C.
ben_cal wrote:

Loïc Joly wrote:


Euh, il me semblait que tu avais déjà eu de bonnes solutions,
qu'est-ce qui ne te conviens pas avec ?



A moins que j'ai rate un truc, mais les solutions proposees suppposent
que ce soit moi qui definisse REAL. Malheureusement ce n'est pas le
cas car il est defini dans les options de compilation...
Donc, je me retrouve avec un REAL deja defini et utilise partout dans
le code.
Pour resumer, on doit pouvoir recompiler toutes les libs uniquement en
ne changeant que cette option de compilation...
Ya t'il un truc que j'aurais manque?

Benoit

#ifdef REAL

#define EPSILON 1e-6 //pas sur pour la syntaxe
#else
#define EPSILON 1e-4
#endif

Ca devrait aller ça non ?

flure


Avatar
Matthieu Moy
"Florent C." writes:

#ifdef REAL
#define EPSILON 1e-6 //pas sur pour la syntaxe
#else
#define EPSILON 1e-4
#endif

Ca devrait aller ça non ?


Sans les espaces avant les '#' ;-)

Le problème à l'origine, c'est que le préprocesseur C/C++ ne peut pas
faire de comparaison de chaines.

La solution avec templates me parait plus proche de la solution
cherchée.

template<class T>
class EPSILON {
static REAL value;
};

class EPSILON<float> {
static REAL value;
};

REAL EPSILON<float>::value = ...;

class EPSILON<long> {
static REAL value;
};

REAL EPSILON<long>::value = ...;

et utiliser ensuite EPSILON<REAL>::value.

(non testé, et sans doute améliorable !)

--
Matthieu

Avatar
Loïc Joly
Matthieu Moy wrote:

"Florent C." writes:


#ifdef REAL
#define EPSILON 1e-6 //pas sur pour la syntaxe
#else
#define EPSILON 1e-4
#endif

Ca devrait aller ça non ?



Sans les espaces avant les '#' ;-)


Pourquoi ?

--
Loïc


Avatar
espie
In article <4035c98b$,
ben_cal wrote:
Loïc Joly wrote:


Euh, il me semblait que tu avais déjà eu de bonnes solutions,
qu'est-ce qui ne te conviens pas avec ?



A moins que j'ai rate un truc, mais les solutions proposees suppposent
que ce soit moi qui definisse REAL. Malheureusement ce n'est pas le cas
car il est defini dans les options de compilation...
Donc, je me retrouve avec un REAL deja defini et utilise partout dans le
code.
Pour resumer, on doit pouvoir recompiler toutes les libs uniquement en
ne changeant que cette option de compilation...
Ya t'il un truc que j'aurais manque?


Tu es sur que les gens avec qui tu travailles font du C++ ?
Parce que la, l'utilisation a outrance de REAL comme option de compilation
ressemble a une utilisation abusive du preprocesseur.

Surtout que, comme on t'a deja repondu, le C++ a des solutions parfaitement
appropriees au type de probleme auquel tu as affaire. Essentiellement,
les traits de la bibliotheque standard (numeric_limits<>), et peut-etre un
typedef raisonnable quelque part histoire de definir le type de reels
employes (et encore, il y a sans doute une bonne partie de la bibliotheque
qui gagnerait a savoir gerer les deux, et a utiliser des template pour
instancier le type qui va bien).

Les #define REAL float ou #define REAL double
me rappellent de treees vieux souvenirs de programmation C, et font partie
de ces techniques que je ne suis pas DU TOUT decu d'avoir laisse derriere
moi lors de la migration vers du C++ moderne.


Avatar
ben_cal
Merci a tous pour vos reponses,

Benoit
1 2