Le 17/09/2009 13:27, Pascal J. Bourguignon répondait à kangs :
Actuellement je fais en gros : #define CMP( indicateur )
do{
if { instA.indicateur() != fromBDD.indicateur() )
{
do_1( irow, icol );
}
}while(0)
Oui aux « » de fin de ligne pour dire que la macro n'est pas finie, en revanche le « do { ... } while(0) » ne me semble pas indispensable pour une macro aussi simple et définie dans le même fichier. Ok, cela fait des « ; » inutiles, mais est-ce que cela gênera le compilateur ?
À la limite, on pourrait même envisager d'écrire : #define CMP(indicateur) if (instA.indicateur() != fromBDD.indicateur()) do_1(irow, icol)
Note : il y avait une accolade ouvrante à la place d'une parenthèse ouvrante, je suppose que c'était une erreur de recopie ici, erreur absente du fichier source.
Personnellement, je ne trouve rien à redire sur l'usage d'une macro ici.
Moi non plus. Mon avis serait différent si la macro était dans un fichier .h inclus, au lieu d'être définie dans le fichier même où elle est utilisée.
Le 17/09/2009 13:27, Pascal J. Bourguignon répondait à kangs :
Actuellement je fais en gros :
#define CMP( indicateur )
do{
if { instA.indicateur() != fromBDD.indicateur() )
{
do_1( irow, icol );
}
}while(0)
Oui aux « » de fin de ligne pour dire que la macro n'est pas finie, en
revanche le « do { ... } while(0) » ne me semble pas indispensable pour
une macro aussi simple et définie dans le même fichier. Ok, cela fait
des « ; » inutiles, mais est-ce que cela gênera le compilateur ?
À la limite, on pourrait même envisager d'écrire :
#define CMP(indicateur)
if (instA.indicateur() != fromBDD.indicateur())
do_1(irow, icol)
Note : il y avait une accolade ouvrante à la place d'une parenthèse
ouvrante, je suppose que c'était une erreur de recopie ici, erreur
absente du fichier source.
Personnellement, je ne trouve rien à redire sur l'usage d'une macro ici.
Moi non plus. Mon avis serait différent si la macro était dans un
fichier .h inclus, au lieu d'être définie dans le fichier même où
elle est utilisée.
Le 17/09/2009 13:27, Pascal J. Bourguignon répondait à kangs :
Actuellement je fais en gros : #define CMP( indicateur )
do{
if { instA.indicateur() != fromBDD.indicateur() )
{
do_1( irow, icol );
}
}while(0)
Oui aux « » de fin de ligne pour dire que la macro n'est pas finie, en revanche le « do { ... } while(0) » ne me semble pas indispensable pour une macro aussi simple et définie dans le même fichier. Ok, cela fait des « ; » inutiles, mais est-ce que cela gênera le compilateur ?
À la limite, on pourrait même envisager d'écrire : #define CMP(indicateur) if (instA.indicateur() != fromBDD.indicateur()) do_1(irow, icol)
Note : il y avait une accolade ouvrante à la place d'une parenthèse ouvrante, je suppose que c'était une erreur de recopie ici, erreur absente du fichier source.
Personnellement, je ne trouve rien à redire sur l'usage d'une macro ici.
Moi non plus. Mon avis serait différent si la macro était dans un fichier .h inclus, au lieu d'être définie dans le fichier même où elle est utilisée.
pjb
Olivier Miakinen <om+ writes:
Oui aux « » de fin de ligne pour dire que la macro n'est pas finie, en revanche le « do { ... } while(0) » ne me semble pas indispensable pour une macro aussi simple et définie dans le même fichier. Ok, cela fait des « ; » inutiles, mais est-ce que cela gênera le compilateur ?
D'accord. Je trouve juste que c'est une bonne habitude à prendre de toujours mettre les macros "procedures" entre do{ et }while(0).
-- __Pascal Bourguignon__
Olivier Miakinen <om+news@miakinen.net> writes:
Oui aux « » de fin de ligne pour dire que la macro n'est pas finie, en
revanche le « do { ... } while(0) » ne me semble pas indispensable pour
une macro aussi simple et définie dans le même fichier. Ok, cela fait
des « ; » inutiles, mais est-ce que cela gênera le compilateur ?
D'accord. Je trouve juste que c'est une bonne habitude à prendre de
toujours mettre les macros "procedures" entre do{ et }while(0).
Oui aux « » de fin de ligne pour dire que la macro n'est pas finie, en revanche le « do { ... } while(0) » ne me semble pas indispensable pour une macro aussi simple et définie dans le même fichier. Ok, cela fait des « ; » inutiles, mais est-ce que cela gênera le compilateur ?
D'accord. Je trouve juste que c'est une bonne habitude à prendre de toujours mettre les macros "procedures" entre do{ et }while(0).
-- __Pascal Bourguignon__
kangs
On 17 sep, 13:27, (Pascal J. Bourguignon) wrote: [...]
Ceci dit, on peut effectivement utiliser une fonction template:
if ( cmp( a, b, &A::ind1 ) ) std::cout << "ind1 ==n"; else std::cout << "ind1 !=n";
if ( cmp( a, b, &A::ind2 ) ) std::cout << "ind2 ==n"; else std::cout << "ind2 !=n";
return 0; }
Le compilateur me sort : est.cpp: In function bool cmp(const A&, const B&, GETTER) [with GETTER = int (A::*)()const]: test.cpp:49: instantiated from here test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...) test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...) test.cpp: In function bool cmp(const A&, const B&, GETTER) [with GETTER = double (A::*)()const]: test.cpp:54: instantiated from here test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...) test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...)
J'ai essayé de remplacer a->*getter() != b->*getter() par a.*getter() ! = b.*getter() mais ça ne change rien.
Qu'est ce qui cloche ?
On 17 sep, 13:27, p...@informatimago.com (Pascal J. Bourguignon)
wrote:
[...]
Ceci dit, on peut effectivement utiliser une fonction template:
if ( cmp( a, b, &A::ind1 ) )
std::cout << "ind1 ==n";
else
std::cout << "ind1 !=n";
if ( cmp( a, b, &A::ind2 ) )
std::cout << "ind2 ==n";
else
std::cout << "ind2 !=n";
return 0;
}
Le compilateur me sort :
est.cpp: In function bool cmp(const A&, const B&, GETTER) [with
GETTER = int (A::*)()const]:
test.cpp:49: instantiated from here
test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er
function in getter (...)
test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er
function in getter (...)
test.cpp: In function bool cmp(const A&, const B&, GETTER) [with
GETTER = double (A::*)()const]:
test.cpp:54: instantiated from here
test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er
function in getter (...)
test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er
function in getter (...)
J'ai essayé de remplacer a->*getter() != b->*getter() par a.*getter() !
= b.*getter() mais ça ne change rien.
if ( cmp( a, b, &A::ind1 ) ) std::cout << "ind1 ==n"; else std::cout << "ind1 !=n";
if ( cmp( a, b, &A::ind2 ) ) std::cout << "ind2 ==n"; else std::cout << "ind2 !=n";
return 0; }
Le compilateur me sort : est.cpp: In function bool cmp(const A&, const B&, GETTER) [with GETTER = int (A::*)()const]: test.cpp:49: instantiated from here test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...) test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...) test.cpp: In function bool cmp(const A&, const B&, GETTER) [with GETTER = double (A::*)()const]: test.cpp:54: instantiated from here test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...) test.cpp:34: erreur: must use .* or ->* to call pointer-to-memb er function in getter (...)
J'ai essayé de remplacer a->*getter() != b->*getter() par a.*getter() ! = b.*getter() mais ça ne change rien.
Qu'est ce qui cloche ?
pjb
kangs writes:
Le compilateur me sort : est.cpp: In function âbool cmp(const A&, const B&, GETTER) [with GETTER = int (A::*)()const]â: test.cpp:49: instantiated from here test.cpp:34: erreur: must use â.*â or â->*â to call pointer-to-member function in âgetter (...)â
Qu'est ce qui cloche ?
Il faut des parentheses: if( (a->*getter)() != (b->*getter)() )
-- __Pascal Bourguignon__
kangs <philippe.lrx@gmail.com> writes:
Le compilateur me sort :
est.cpp: In function âbool cmp(const A&, const B&, GETTER) [with
GETTER = int (A::*)()const]â:
test.cpp:49: instantiated from here
test.cpp:34: erreur: must use â.*â or â->*â to call pointer-to-member
function in âgetter (...)â
Qu'est ce qui cloche ?
Il faut des parentheses: if( (a->*getter)() != (b->*getter)() )
Le compilateur me sort : est.cpp: In function âbool cmp(const A&, const B&, GETTER) [with GETTER = int (A::*)()const]â: test.cpp:49: instantiated from here test.cpp:34: erreur: must use â.*â or â->*â to call pointer-to-member function in âgetter (...)â
Qu'est ce qui cloche ?
Il faut des parentheses: if( (a->*getter)() != (b->*getter)() )
-- __Pascal Bourguignon__
pjb
kangs writes:
Le compilateur me sort : est.cpp: In function âbool cmp(const A&, const B&, GETTER) [with GETTER = int (A::*)()const]â: test.cpp:49: instantiated from here test.cpp:34: erreur: must use â.*â or â->*â to call pointer-to-member function in âgetter (...)â
Le compilateur me sort :
est.cpp: In function âbool cmp(const A&, const B&, GETTER) [with
GETTER = int (A::*)()const]â:
test.cpp:49: instantiated from here
test.cpp:34: erreur: must use â.*â or â->*â to call pointer-to-member
function in âgetter (...)â
Le compilateur me sort : est.cpp: In function âbool cmp(const A&, const B&, GETTER) [with GETTER = int (A::*)()const]â: test.cpp:49: instantiated from here test.cpp:34: erreur: must use â.*â or â->*â to call pointer-to-member function in âgetter (...)â
On 18 sep, 10:51, (Pascal J. Bourguignon) wrote: [...]
Il faut mettre des parentheses autour de (obj->*method) ou (obj.*method), et puisqu'ici on n'a pas un pointeur mais une référenc e vers ces objets, il faut utiliser .*:
On 18 sep, 10:51, p...@informatimago.com (Pascal J. Bourguignon)
wrote:
[...]
Il faut mettre des parentheses autour de (obj->*method) ou
(obj.*method), et puisqu'ici on n'a pas un pointeur mais une référenc e
vers ces objets, il faut utiliser .*:
On 18 sep, 10:51, (Pascal J. Bourguignon) wrote: [...]
Il faut mettre des parentheses autour de (obj->*method) ou (obj.*method), et puisqu'ici on n'a pas un pointeur mais une référenc e vers ces objets, il faut utiliser .*:
Le 17/09/2009 13:27, Pascal J. Bourguignon répondait à kangs :
[...] Note : il y avait une accolade ouvrante à la place d'une parenthèse ouvrante, je suppose que c'était une erreur de recopie ici, erreur absente du fichier source.
Je n'ai pas copié j'ai juste voulu montrer l'idée...
> Personnellement, je ne trouve rien à redire sur l'usage d'une macro i ci.
Oui surtout que la solution template est plus /lourde/.
Moi non plus. Mon avis serait différent si la macro était dans un fichier .h inclus, au lieu d'être définie dans le fichier même où elle est utilisée.
En générale j'évite les macros, quand j'en utilise elles sont locales à une fonction. J'ai vraiment du mal a penser qu'un jour les macros n'existeront plus en C++, je les trouve parfois bien pratiques.
On 17 sep, 16:57, Olivier Miakinen <om+n...@miakinen.net> wrote:
Le 17/09/2009 13:27, Pascal J. Bourguignon répondait à kangs :
[...]
Note : il y avait une accolade ouvrante à la place d'une parenthèse
ouvrante, je suppose que c'était une erreur de recopie ici, erreur
absente du fichier source.
Je n'ai pas copié j'ai juste voulu montrer l'idée...
> Personnellement, je ne trouve rien à redire sur l'usage d'une macro i ci.
Oui surtout que la solution template est plus /lourde/.
Moi non plus. Mon avis serait différent si la macro était dans un
fichier .h inclus, au lieu d'être définie dans le fichier même où
elle est utilisée.
En générale j'évite les macros, quand j'en utilise elles sont locales
à une fonction.
J'ai vraiment du mal a penser qu'un jour les macros n'existeront plus
en C++, je les trouve parfois bien pratiques.
Le 17/09/2009 13:27, Pascal J. Bourguignon répondait à kangs :
[...] Note : il y avait une accolade ouvrante à la place d'une parenthèse ouvrante, je suppose que c'était une erreur de recopie ici, erreur absente du fichier source.
Je n'ai pas copié j'ai juste voulu montrer l'idée...
> Personnellement, je ne trouve rien à redire sur l'usage d'une macro i ci.
Oui surtout que la solution template est plus /lourde/.
Moi non plus. Mon avis serait différent si la macro était dans un fichier .h inclus, au lieu d'être définie dans le fichier même où elle est utilisée.
En générale j'évite les macros, quand j'en utilise elles sont locales à une fonction. J'ai vraiment du mal a penser qu'un jour les macros n'existeront plus en C++, je les trouve parfois bien pratiques.
pjb
kangs writes:
En générale j'évite les macros, quand j'en utilise elles sont locales à une fonction. J'ai vraiment du mal a penser qu'un jour les macros n'existeront plus en C++, je les trouve parfois bien pratiques.
Si jamais ça arrive, tu pourras toujours passer à Lisp. ;-)
En passant, faire une macro "locale" avec cpp, est assez délicat; Le mieux que l'on puisse faire, c'est utiliser #undef:
En générale j'évite les macros, quand j'en utilise elles sont locales
à une fonction.
J'ai vraiment du mal a penser qu'un jour les macros n'existeront plus
en C++, je les trouve parfois bien pratiques.
Si jamais ça arrive, tu pourras toujours passer à Lisp. ;-)
En passant, faire une macro "locale" avec cpp, est assez délicat; Le
mieux que l'on puisse faire, c'est utiliser #undef:
En générale j'évite les macros, quand j'en utilise elles sont locales à une fonction. J'ai vraiment du mal a penser qu'un jour les macros n'existeront plus en C++, je les trouve parfois bien pratiques.
Si jamais ça arrive, tu pourras toujours passer à Lisp. ;-)
En passant, faire une macro "locale" avec cpp, est assez délicat; Le mieux que l'on puisse faire, c'est utiliser #undef: