OVH Cloud OVH Cloud

inline vs macro

5 réponses
Avatar
Benoit Rousseau
Bonjour,
Est ce que
#define min(A, B) (a < b ? a : b) (ou a peu près)
revient au même qu'une fonction inline (peut être en template ou
quelquechose comme ca ?)

inline template<struct T>
T min(const T& a, const T& b) {
if( a < b ) return a;
else return b;

Est ce que l'on restreint la portée du define si on l'enferme dans un
namespace?

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

5 réponses

Avatar
Fabien LE LEZ
On Fri, 31 Oct 2003 22:18:45 +0100, Benoit Rousseau
wrote:

Est ce que l'on restreint la portée du define


On ne peut pas restreindre la portée d'un #define -- c'est pourquoi on
en restreint l'usage au maximum.

--
;-)

Avatar
Loïc Joly
Benoit Rousseau wrote:

Bonjour,
Est ce que
#define min(A, B) (a < b ? a : b) (ou a peu près)

revient au même qu'une fonction inline (peut être en template ou
quelquechose comme ca ?)

inline template<struct T>
T min(const T& a, const T& b) {
if( a < b ) return a;
else return b;


Pas tout à fait :
Dans le premier cas, min (i++, j) pourra produire des effets étranges
(équivalent à (i++ < j ? i++ : j)). F'autres variantes tordues existent.

D'un autre côté, avec la deuxième méthode, min(1, 2.3) ne marchera pas,
ce qui n'est pas génial non plus (pour un template, le compilateur ne
peut pas appliquer les conversions classiques aux arguments).


Est ce que l'on restreint la portée du define si on l'enferme dans un
namespace?


Non :(

--
Loïc

Avatar
Fabien LE LEZ
On Sat, 01 Nov 2003 00:23:31 +0100, Loïc Joly
wrote:

inline template<struct T>
T min(const T& a, const T& b) {


D'un autre côté, avec la deuxième méthode, min(1, 2.3) ne marchera pas,
ce qui n'est pas génial non plus (pour un template, le compilateur ne
peut pas appliquer les conversions classiques aux arguments).


J'ai fini par en avoir marre de cette restriction, et écrire mes
propres fonctions :

template <class T, class T2> T Min (T const& a, T2 const& b)
{
if (a<b) return a; else return b;
}

--
;-)


Avatar
Benoit Rousseau
Loïc Joly wrote:
Benoit Rousseau wrote:

Bonjour,
Est ce que
#define min(A, B) (a < b ? a : b) (ou a peu près)
correspond à template<T> inline T min( T&, T& )



Pas tout à fait :
Dans le premier cas, min (i++, j) pourra produire des effets étranges
(équivalent à (i++ < j ? i++ : j)). F'autres variantes tordues existent.


Oui, c'est un effet indésirable même... Mais je "purifie" un code déjà
existant, alors j'essaie de retirer tout ce qui ne va pas

D'un autre côté, avec la deuxième méthode, min(1, 2.3) ne marchera pas,
ce qui n'est pas génial non plus (pour un template, le compilateur ne
peut pas appliquer les conversions classiques aux arguments).
Si il s'agit juste de choisir le type avant de lancer la fonction, ca

n'est pas un problème.
Je comptais même l'utiliser en min<double>( (double)1, 2.3 );
Mais je me suis rendu compte que <double> n'était pas nécessaire...

Est ce que l'on restreint la portée du define si on l'enferme dans un
namespace?
Non :(



C'est vraiment nul alors... ils auraient pu penser à ça pour la
"nouvelle" norme : les anciens #define n'auraient pas été affectés, et
les nouveaux auraient pu être encapsulés...


--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Fabien LE LEZ
On Sat, 01 Nov 2003 10:27:47 +0100, Benoit Rousseau
wrote:

Est ce que l'on restreint la portée du define si on l'enferme dans un
namespace?
Non :(



C'est vraiment nul alors... ils auraient pu penser à ça pour la
"nouvelle" norme : les anciens #define n'auraient pas été affectés, et
les nouveaux auraient pu être encapsulés...


De quels "nouveaux" parles-tu ?
Le #define est traité par le préprocesseur, avant même que le
compilateur proprement dit ne soit appelé. Et le préprocesseur ne
connaît rien des namespaces.
La solution est très simple : l'usage des #define est à réserver aux
cas (assez rares) où on ne peut pas faire autrement.

--
;-)