Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
Merci d'avance
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
Merci d'avance
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
Merci d'avance
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
Merci d'avance
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
Merci d'avance
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
Merci d'avance
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
assert est une macro définie dans assert.h
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
assert est une macro définie dans assert.h
Bonjour
Est ce que vous pouvez me dire ce que fait cette macro svp ? je n'ai pas
trouvé sur le net de description de celle ci
assert(condition)
assert est une macro définie dans assert.h
assert(condition)
Ca permet de vérifier une condition et de stopper le programme si la
condition est fausse. Généralement utilisé pour du debug/de la prevention
de bug :
assert(condition)
Ca permet de vérifier une condition et de stopper le programme si la
condition est fausse. Généralement utilisé pour du debug/de la prevention
de bug :
assert(condition)
Ca permet de vérifier une condition et de stopper le programme si la
condition est fausse. Généralement utilisé pour du debug/de la prevention
de bug :
Est ce que vous pouvez me dire ce que fait cette macro svp ?
je n'ai pas trouvé sur le net de description de celle ci
assert(condition)
assert est une macro définie dans assert.h
Je préfère écrire assert(expr), expr s'évaluant en un type
"scalar".
Elle se développe différemment selon qu'une macro NDEBUG est
ou non définie *au moment de l'inclusion de assert.h*.
- Si NDEBUG est définie, elle se développe en .. que dalle ((void)0).
- Si NDEBUG n'est pas définie, la macro assert évalue expr. Si le
résultat est nul, elle affiche un message de diagnostic (sur stderr
généralement) puis appelle abort(). Si le résultat n'est pas nul, i l ne
se passe rien de plus.
Attention, expr est ou non évaluée selon NDEBUG, avec les
effets de bord possibles de cette évaluation *éventuelle*.
On voit par exemple, je crois dans du code exemple Microsoft:
UneStructure TestA;
assert(UneFonctionApi(,,&TestA,,));
.....
assert(UneAutreFonction());
Personnellement, je préfèrerais, certainement parce que je
"lis" encore mal assert, utiliser des blocs #ifdef NDEBUG et
réduire les assert à de simples évaluations.
Est ce que vous pouvez me dire ce que fait cette macro svp ?
je n'ai pas trouvé sur le net de description de celle ci
assert(condition)
assert est une macro définie dans assert.h
Je préfère écrire assert(expr), expr s'évaluant en un type
"scalar".
Elle se développe différemment selon qu'une macro NDEBUG est
ou non définie *au moment de l'inclusion de assert.h*.
- Si NDEBUG est définie, elle se développe en .. que dalle ((void)0).
- Si NDEBUG n'est pas définie, la macro assert évalue expr. Si le
résultat est nul, elle affiche un message de diagnostic (sur stderr
généralement) puis appelle abort(). Si le résultat n'est pas nul, i l ne
se passe rien de plus.
Attention, expr est ou non évaluée selon NDEBUG, avec les
effets de bord possibles de cette évaluation *éventuelle*.
On voit par exemple, je crois dans du code exemple Microsoft:
UneStructure TestA;
assert(UneFonctionApi(,,&TestA,,));
.....
assert(UneAutreFonction());
Personnellement, je préfèrerais, certainement parce que je
"lis" encore mal assert, utiliser des blocs #ifdef NDEBUG et
réduire les assert à de simples évaluations.
Est ce que vous pouvez me dire ce que fait cette macro svp ?
je n'ai pas trouvé sur le net de description de celle ci
assert(condition)
assert est une macro définie dans assert.h
Je préfère écrire assert(expr), expr s'évaluant en un type
"scalar".
Elle se développe différemment selon qu'une macro NDEBUG est
ou non définie *au moment de l'inclusion de assert.h*.
- Si NDEBUG est définie, elle se développe en .. que dalle ((void)0).
- Si NDEBUG n'est pas définie, la macro assert évalue expr. Si le
résultat est nul, elle affiche un message de diagnostic (sur stderr
généralement) puis appelle abort(). Si le résultat n'est pas nul, i l ne
se passe rien de plus.
Attention, expr est ou non évaluée selon NDEBUG, avec les
effets de bord possibles de cette évaluation *éventuelle*.
On voit par exemple, je crois dans du code exemple Microsoft:
UneStructure TestA;
assert(UneFonctionApi(,,&TestA,,));
.....
assert(UneAutreFonction());
Personnellement, je préfèrerais, certainement parce que je
"lis" encore mal assert, utiliser des blocs #ifdef NDEBUG et
réduire les assert à de simples évaluations.
Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En fait,
dans le code de production, j'interdis des #ifdef complètement.
Il y a des cas, dans les en-têtes et au niveau de portée du
fichier, où on pourrait en discuter. Mais je n'accepterais
jamais un #ifdef qui n'est pas à la portée du fichier.)
Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En fait,
dans le code de production, j'interdis des #ifdef complètement.
Il y a des cas, dans les en-têtes et au niveau de portée du
fichier, où on pourrait en discuter. Mais je n'accepterais
jamais un #ifdef qui n'est pas à la portée du fichier.)
Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En fait,
dans le code de production, j'interdis des #ifdef complètement.
Il y a des cas, dans les en-têtes et au niveau de portée du
fichier, où on pourrait en discuter. Mais je n'accepterais
jamais un #ifdef qui n'est pas à la portée du fichier.)
wrote:Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En fait,
dans le code de production, j'interdis des #ifdef complètement.
Il y a des cas, dans les en-têtes et au niveau de portée du
fichier, où on pourrait en discuter. Mais je n'accepterais
jamais un #ifdef qui n'est pas à la portée du fichier.)
C'est curieux, c'est pourtant pratique pour écrire du code multiplatforme.
Le premier exemple qui me vient à l'esprit, c'est l'utilisation des
sockets : car ça se fait de la même façon sous windows et unix au détail
près que sous windows il faut appeler WSAStartup() au démarrage et
WSACleanUp() à l'arret.
Donc je vois bien un truc du genre (dans le .cpp)
MonSocket::MonSocket(...)
{
#ifdef ON_EST_SOUS_WINDOWS
//...
WSAStartup(...);
//...
#endif
}
MonSocket::~MonSocket()
{
#ifdef ON_EST_SOUS_WINDOWS
WSACleanUp();
#endif
}
et evidemment dans le .h on aurait quelque chose comme ca :
#ifdef ON_EST_SOUS_UNIX
# include <unistd.h>
# include <netdb.h>
#endif
#ifdef ON_EST_SOUS_WINDOWS
# include <winsock2.h>
#endif
Enfin voila c'est juste un exemple, il me semble que procéder autrement
compliquerait la chose.
Peut-être James préfère-t-il choisir la fonction (voire la classe)
kanze@gabi-soft.fr wrote:
Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En fait,
dans le code de production, j'interdis des #ifdef complètement.
Il y a des cas, dans les en-têtes et au niveau de portée du
fichier, où on pourrait en discuter. Mais je n'accepterais
jamais un #ifdef qui n'est pas à la portée du fichier.)
C'est curieux, c'est pourtant pratique pour écrire du code multiplatforme.
Le premier exemple qui me vient à l'esprit, c'est l'utilisation des
sockets : car ça se fait de la même façon sous windows et unix au détail
près que sous windows il faut appeler WSAStartup() au démarrage et
WSACleanUp() à l'arret.
Donc je vois bien un truc du genre (dans le .cpp)
MonSocket::MonSocket(...)
{
#ifdef ON_EST_SOUS_WINDOWS
//...
WSAStartup(...);
//...
#endif
}
MonSocket::~MonSocket()
{
#ifdef ON_EST_SOUS_WINDOWS
WSACleanUp();
#endif
}
et evidemment dans le .h on aurait quelque chose comme ca :
#ifdef ON_EST_SOUS_UNIX
# include <unistd.h>
# include <netdb.h>
#endif
#ifdef ON_EST_SOUS_WINDOWS
# include <winsock2.h>
#endif
Enfin voila c'est juste un exemple, il me semble que procéder autrement
compliquerait la chose.
Peut-être James préfère-t-il choisir la fonction (voire la classe)
wrote:Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En fait,
dans le code de production, j'interdis des #ifdef complètement.
Il y a des cas, dans les en-têtes et au niveau de portée du
fichier, où on pourrait en discuter. Mais je n'accepterais
jamais un #ifdef qui n'est pas à la portée du fichier.)
C'est curieux, c'est pourtant pratique pour écrire du code multiplatforme.
Le premier exemple qui me vient à l'esprit, c'est l'utilisation des
sockets : car ça se fait de la même façon sous windows et unix au détail
près que sous windows il faut appeler WSAStartup() au démarrage et
WSACleanUp() à l'arret.
Donc je vois bien un truc du genre (dans le .cpp)
MonSocket::MonSocket(...)
{
#ifdef ON_EST_SOUS_WINDOWS
//...
WSAStartup(...);
//...
#endif
}
MonSocket::~MonSocket()
{
#ifdef ON_EST_SOUS_WINDOWS
WSACleanUp();
#endif
}
et evidemment dans le .h on aurait quelque chose comme ca :
#ifdef ON_EST_SOUS_UNIX
# include <unistd.h>
# include <netdb.h>
#endif
#ifdef ON_EST_SOUS_WINDOWS
# include <winsock2.h>
#endif
Enfin voila c'est juste un exemple, il me semble que procéder autrement
compliquerait la chose.
Peut-être James préfère-t-il choisir la fonction (voire la classe)
wrote:Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En
fait, dans le code de production, j'interdis des #ifdef
complètement. Il y a des cas, dans les en-têtes et au
niveau de portée du fichier, où on pourrait en
discuter. Mais je n'accepterais jamais un #ifdef qui n'est
pas à la portée du fichier.)
C'est curieux, c'est pourtant pratique pour écrire du code
multiplatforme.
Le premier exemple qui me vient à l'esprit,
c'est l'utilisation des sockets :
car ça se fait de la même façon sous windows et unix au détail
près que sous windows il faut appeler WSAStartup() au
démarrage et WSACleanUp() à l'arret.
Donc je vois bien un truc du genre (dans le .cpp)
MonSocket::MonSocket(...)
{
#ifdef ON_EST_SOUS_WINDOWS
//...
WSAStartup(...);
//...
#endif
}
MonSocket::~MonSocket()
{
#ifdef ON_EST_SOUS_WINDOWS
WSACleanUp();
#endif
}
et evidemment dans le .h on aurait quelque chose comme ca :
#ifdef ON_EST_SOUS_UNIX
# include <unistd.h>
# include <netdb.h>
#endif
#ifdef ON_EST_SOUS_WINDOWS
# include <winsock2.h>
#endif
kanze@gabi-soft.fr wrote:
Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En
fait, dans le code de production, j'interdis des #ifdef
complètement. Il y a des cas, dans les en-têtes et au
niveau de portée du fichier, où on pourrait en
discuter. Mais je n'accepterais jamais un #ifdef qui n'est
pas à la portée du fichier.)
C'est curieux, c'est pourtant pratique pour écrire du code
multiplatforme.
Le premier exemple qui me vient à l'esprit,
c'est l'utilisation des sockets :
car ça se fait de la même façon sous windows et unix au détail
près que sous windows il faut appeler WSAStartup() au
démarrage et WSACleanUp() à l'arret.
Donc je vois bien un truc du genre (dans le .cpp)
MonSocket::MonSocket(...)
{
#ifdef ON_EST_SOUS_WINDOWS
//...
WSAStartup(...);
//...
#endif
}
MonSocket::~MonSocket()
{
#ifdef ON_EST_SOUS_WINDOWS
WSACleanUp();
#endif
}
et evidemment dans le .h on aurait quelque chose comme ca :
#ifdef ON_EST_SOUS_UNIX
# include <unistd.h>
# include <netdb.h>
#endif
#ifdef ON_EST_SOUS_WINDOWS
# include <winsock2.h>
#endif
wrote:Il ne faut jamais mettre des #ifdef à l'intérieur d'une
fonction. Ça rend la fonction complètement illisible. (En
fait, dans le code de production, j'interdis des #ifdef
complètement. Il y a des cas, dans les en-têtes et au
niveau de portée du fichier, où on pourrait en
discuter. Mais je n'accepterais jamais un #ifdef qui n'est
pas à la portée du fichier.)
C'est curieux, c'est pourtant pratique pour écrire du code
multiplatforme.
Le premier exemple qui me vient à l'esprit,
c'est l'utilisation des sockets :
car ça se fait de la même façon sous windows et unix au détail
près que sous windows il faut appeler WSAStartup() au
démarrage et WSACleanUp() à l'arret.
Donc je vois bien un truc du genre (dans le .cpp)
MonSocket::MonSocket(...)
{
#ifdef ON_EST_SOUS_WINDOWS
//...
WSAStartup(...);
//...
#endif
}
MonSocket::~MonSocket()
{
#ifdef ON_EST_SOUS_WINDOWS
WSACleanUp();
#endif
}
et evidemment dans le .h on aurait quelque chose comme ca :
#ifdef ON_EST_SOUS_UNIX
# include <unistd.h>
# include <netdb.h>
#endif
#ifdef ON_EST_SOUS_WINDOWS
# include <winsock2.h>
#endif
Je verrais plutôt deux .cc différentes, dans des répertoires
différentes. Tu compiles l'un ou l'autre selon la platforme
ciblée, au moyen des options dans le fichier de make.
(En passant, je ne sais pas comment tu peux dire que ça se fait
de la même façon sous Windows que sous Unix, quand ça ne se fait
pas de la même façon entre deux Unix.)
Ni l'un ni l'autre dans le .hh. Ce genre de détail ne concerne
pas le client.
Je verrais plutôt deux .cc différentes, dans des répertoires
différentes. Tu compiles l'un ou l'autre selon la platforme
ciblée, au moyen des options dans le fichier de make.
(En passant, je ne sais pas comment tu peux dire que ça se fait
de la même façon sous Windows que sous Unix, quand ça ne se fait
pas de la même façon entre deux Unix.)
Ni l'un ni l'autre dans le .hh. Ce genre de détail ne concerne
pas le client.
Je verrais plutôt deux .cc différentes, dans des répertoires
différentes. Tu compiles l'un ou l'autre selon la platforme
ciblée, au moyen des options dans le fichier de make.
(En passant, je ne sais pas comment tu peux dire que ça se fait
de la même façon sous Windows que sous Unix, quand ça ne se fait
pas de la même façon entre deux Unix.)
Ni l'un ni l'autre dans le .hh. Ce genre de détail ne concerne
pas le client.
wrote:
Peut-être James préfère-t-il choisir la fonction (voire la
classe) compilée en fonction du contexte ? A ce momemnt-là, si
comme dans votre exemple il y a beaucoup de code commun,
insensible au contexte, il y aura un problème de
synchronisation des modifications (je ne suis pas certain
d'être clair). Il faudra alors séparer dans des fonctions
différentes le code contexte-dépendant et le code commun (en
fait, celui qui fait le boulot). Bon, ceci dit, j'ai tellement
peu d'expérience dans ce domaine...
kanze@gabi-soft.fr wrote:
Peut-être James préfère-t-il choisir la fonction (voire la
classe) compilée en fonction du contexte ? A ce momemnt-là, si
comme dans votre exemple il y a beaucoup de code commun,
insensible au contexte, il y aura un problème de
synchronisation des modifications (je ne suis pas certain
d'être clair). Il faudra alors séparer dans des fonctions
différentes le code contexte-dépendant et le code commun (en
fait, celui qui fait le boulot). Bon, ceci dit, j'ai tellement
peu d'expérience dans ce domaine...
wrote:
Peut-être James préfère-t-il choisir la fonction (voire la
classe) compilée en fonction du contexte ? A ce momemnt-là, si
comme dans votre exemple il y a beaucoup de code commun,
insensible au contexte, il y aura un problème de
synchronisation des modifications (je ne suis pas certain
d'être clair). Il faudra alors séparer dans des fonctions
différentes le code contexte-dépendant et le code commun (en
fait, celui qui fait le boulot). Bon, ceci dit, j'ai tellement
peu d'expérience dans ce domaine...