En 418a5531$0$23274$, K. Ahausse va escriure:- pas de goto.
le PB en C++ le voilà :
int toto (void)
{
int A=0 ;
goto Fin ;
int B = 0 ;
Fin:
return A ;
}
C'est un problème ? Pour qui ?
Si un compilo C a mangé cela sans broncher, c'est qu'il est franchement
récent, donc le source l'est encore plus, ce qui n'est pas le cas évoqué
par
Jean-Marc.
En 418a5531$0$23274$8fcfb975@news.wanadoo.fr, K. Ahausse va escriure:
- pas de goto.
le PB en C++ le voilà :
int toto (void)
{
int A=0 ;
goto Fin ;
int B = 0 ;
Fin:
return A ;
}
C'est un problème ? Pour qui ?
Si un compilo C a mangé cela sans broncher, c'est qu'il est franchement
récent, donc le source l'est encore plus, ce qui n'est pas le cas évoqué
par
Jean-Marc.
En 418a5531$0$23274$, K. Ahausse va escriure:- pas de goto.
le PB en C++ le voilà :
int toto (void)
{
int A=0 ;
goto Fin ;
int B = 0 ;
Fin:
return A ;
}
C'est un problème ? Pour qui ?
Si un compilo C a mangé cela sans broncher, c'est qu'il est franchement
récent, donc le source l'est encore plus, ce qui n'est pas le cas évoqué
par
Jean-Marc.
Laurent Deniau writes:
| Jean-Marc Bourguet wrote:
| > Laurent Deniau writes:
| >>Une question au hasard. Vous gerez comment les exceptions dans votre
| >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > a
| > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > composant directement n'est pas modifie pour intercepter les
| > exceptions possibles, il y a un probleme dans la modif.
|
| Tu veux dire que toutes les methodes C++ de votre couche bas niveau
| sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| les perfs sauf compilo tres efficace sur un try.
Pardon ?
(Glibc est bourré de throw() et le compilateur optimise à base de ça).
Laurent Deniau <Laurent.Deniau@cern.ch> writes:
| Jean-Marc Bourguet wrote:
| > Laurent Deniau <Laurent.Deniau@cern.ch> writes:
| >>Une question au hasard. Vous gerez comment les exceptions dans votre
| >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > a
| > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > composant directement n'est pas modifie pour intercepter les
| > exceptions possibles, il y a un probleme dans la modif.
|
| Tu veux dire que toutes les methodes C++ de votre couche bas niveau
| sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| les perfs sauf compilo tres efficace sur un try.
Pardon ?
(Glibc est bourré de throw() et le compilateur optimise à base de ça).
Laurent Deniau writes:
| Jean-Marc Bourguet wrote:
| > Laurent Deniau writes:
| >>Une question au hasard. Vous gerez comment les exceptions dans votre
| >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > a
| > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > composant directement n'est pas modifie pour intercepter les
| > exceptions possibles, il y a un probleme dans la modif.
|
| Tu veux dire que toutes les methodes C++ de votre couche bas niveau
| sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| les perfs sauf compilo tres efficace sur un try.
Pardon ?
(Glibc est bourré de throw() et le compilateur optimise à base de ça).
Jean-Marc Bourguet writes:
| Laurent Deniau writes:
|
| > int x[99];
| > void f()
| > {
| > struct x { int a; };
| > sizeof(x); /* size of the array in C, size of the struct in C++ */
| > }
|
| Ah oui. Apparemment ce n'est pas tombe. Faut dire qu'il doit pas y
| avoir beaucoup de definition de struct locales a des fonctions et
| que la plupart des utilisations doivent entrainer un diagnostic. (Si
| on utilise sizeof(x), il y a des chances qu'on utilise le x originel
| aussi et ca va clasher. Ok, il doit y avoir moyen de batir quelque
| chose de plus ou moins vraissemblable mais c'est rare).
Je crois que le fond de la question est pourquoi il y a cette
différence. Par exemple, les deux codes suivants ont la même
siginification en C et en C++.
struct x { int a; };
void f()
{
int x[99];
sizeof(x); // size of the array "x" in C and C++
}
void g()
{
int x[99];
struct x { int a; };
sizeof(x); // size of the array "x" in C and C++
}
Jean-Marc Bourguet <jm@bourguet.org> writes:
| Laurent Deniau <Laurent.Deniau@cern.ch> writes:
|
| > int x[99];
| > void f()
| > {
| > struct x { int a; };
| > sizeof(x); /* size of the array in C, size of the struct in C++ */
| > }
|
| Ah oui. Apparemment ce n'est pas tombe. Faut dire qu'il doit pas y
| avoir beaucoup de definition de struct locales a des fonctions et
| que la plupart des utilisations doivent entrainer un diagnostic. (Si
| on utilise sizeof(x), il y a des chances qu'on utilise le x originel
| aussi et ca va clasher. Ok, il doit y avoir moyen de batir quelque
| chose de plus ou moins vraissemblable mais c'est rare).
Je crois que le fond de la question est pourquoi il y a cette
différence. Par exemple, les deux codes suivants ont la même
siginification en C et en C++.
struct x { int a; };
void f()
{
int x[99];
sizeof(x); // size of the array "x" in C and C++
}
void g()
{
int x[99];
struct x { int a; };
sizeof(x); // size of the array "x" in C and C++
}
Jean-Marc Bourguet writes:
| Laurent Deniau writes:
|
| > int x[99];
| > void f()
| > {
| > struct x { int a; };
| > sizeof(x); /* size of the array in C, size of the struct in C++ */
| > }
|
| Ah oui. Apparemment ce n'est pas tombe. Faut dire qu'il doit pas y
| avoir beaucoup de definition de struct locales a des fonctions et
| que la plupart des utilisations doivent entrainer un diagnostic. (Si
| on utilise sizeof(x), il y a des chances qu'on utilise le x originel
| aussi et ca va clasher. Ok, il doit y avoir moyen de batir quelque
| chose de plus ou moins vraissemblable mais c'est rare).
Je crois que le fond de la question est pourquoi il y a cette
différence. Par exemple, les deux codes suivants ont la même
siginification en C et en C++.
struct x { int a; };
void f()
{
int x[99];
sizeof(x); // size of the array "x" in C and C++
}
void g()
{
int x[99];
struct x { int a; };
sizeof(x); // size of the array "x" in C and C++
}
Laurent Deniau writes:
| Gabriel Dos Reis wrote:
| > Laurent Deniau writes:
| > | Jean-Marc Bourguet wrote:
| > | > Laurent Deniau writes:
| > | >>Une question au hasard. Vous gerez comment les exceptions dans votre
| > | >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| > | >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > | > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > | > a
| > | > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > | > composant directement n'est pas modifie pour intercepter les
| > | > exceptions possibles, il y a un probleme dans la modif.
| > | | Tu veux dire que toutes les methodes C++ de votre couche bas
| > niveau
| > | sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| > | les perfs sauf compilo tres efficace sur un try.
| > Pardon ?
| > (Glibc est bourré de throw() et le compilateur optimise à base de
| > ça).
|
| tu veux dire que le cas particulier de throw() vide est mieux optimise
| que de mettre le corps de la fonction dans un try{}catch(...){} ?
Si tu appelles une fonction avec throws(), tu sais qu'au site d'appel,
il n'y aura pas d'exception -- si la fonction essaie d'en lever une
(dans le corps de la fonction), il y a abort(). Donc, au site d'appel
le compilateur ne génère plus du code pour traiter les exceptions
inattendus (destruction des objets déjà construit et toussa).
cat g.cpp
void f() throw();
cat f.cpp
void f() throw();
Par contre si tu places l'appel explicitement dans try/catch, le
compilateur est obligé de dupliquer du code (tests et branchements)
au site d'appel -- et dans certains cas empêcher certaines
optimisations.
Laurent Deniau <Laurent.Deniau@cern.ch> writes:
| Gabriel Dos Reis wrote:
| > Laurent Deniau <Laurent.Deniau@cern.ch> writes:
| > | Jean-Marc Bourguet wrote:
| > | > Laurent Deniau <Laurent.Deniau@cern.ch> writes:
| > | >>Une question au hasard. Vous gerez comment les exceptions dans votre
| > | >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| > | >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > | > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > | > a
| > | > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > | > composant directement n'est pas modifie pour intercepter les
| > | > exceptions possibles, il y a un probleme dans la modif.
| > | | Tu veux dire que toutes les methodes C++ de votre couche bas
| > niveau
| > | sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| > | les perfs sauf compilo tres efficace sur un try.
| > Pardon ?
| > (Glibc est bourré de throw() et le compilateur optimise à base de
| > ça).
|
| tu veux dire que le cas particulier de throw() vide est mieux optimise
| que de mettre le corps de la fonction dans un try{}catch(...){} ?
Si tu appelles une fonction avec throws(), tu sais qu'au site d'appel,
il n'y aura pas d'exception -- si la fonction essaie d'en lever une
(dans le corps de la fonction), il y a abort(). Donc, au site d'appel
le compilateur ne génère plus du code pour traiter les exceptions
inattendus (destruction des objets déjà construit et toussa).
cat g.cpp
void f() throw();
cat f.cpp
void f() throw();
Par contre si tu places l'appel explicitement dans try/catch, le
compilateur est obligé de dupliquer du code (tests et branchements)
au site d'appel -- et dans certains cas empêcher certaines
optimisations.
Laurent Deniau writes:
| Gabriel Dos Reis wrote:
| > Laurent Deniau writes:
| > | Jean-Marc Bourguet wrote:
| > | > Laurent Deniau writes:
| > | >>Une question au hasard. Vous gerez comment les exceptions dans votre
| > | >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| > | >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > | > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > | > a
| > | > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > | > composant directement n'est pas modifie pour intercepter les
| > | > exceptions possibles, il y a un probleme dans la modif.
| > | | Tu veux dire que toutes les methodes C++ de votre couche bas
| > niveau
| > | sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| > | les perfs sauf compilo tres efficace sur un try.
| > Pardon ?
| > (Glibc est bourré de throw() et le compilateur optimise à base de
| > ça).
|
| tu veux dire que le cas particulier de throw() vide est mieux optimise
| que de mettre le corps de la fonction dans un try{}catch(...){} ?
Si tu appelles une fonction avec throws(), tu sais qu'au site d'appel,
il n'y aura pas d'exception -- si la fonction essaie d'en lever une
(dans le corps de la fonction), il y a abort(). Donc, au site d'appel
le compilateur ne génère plus du code pour traiter les exceptions
inattendus (destruction des objets déjà construit et toussa).
cat g.cpp
void f() throw();
cat f.cpp
void f() throw();
Par contre si tu places l'appel explicitement dans try/catch, le
compilateur est obligé de dupliquer du code (tests et branchements)
au site d'appel -- et dans certains cas empêcher certaines
optimisations.
Au contraire. C'est un bon moyen d'éviter que du code C se retrouve par
erreur compilé en C++, ce qui n'est un giganteste UB.
Ton argument est completement tiré par les cheveux. En l'occurrence,
compiler en C++ est souvent un bon moyen de découvrir des problèmes.
Portable avec quoi ?
Avec C++ justement! Si d'aventure tu devais porter des routines C dans une
appli C++, tu serais bien content de ne pas avoir à aller à la pêche aux
mots-clés.
Mais l'argument principal pour moi est la lisibilité : si le lecteur connait
et pratique le C et le C++, voire d'autres dialectes dérivés, l'utilisation
de
mots-clés pour un autre usage ralentit la lecture, voire engendre de
mauvaises interprétations. C est un langage déjà suffisament subtil pour ne
pas rajouter de pièges au lecteur futur.
C'est le programmeur qui est beugué, pas la boucle... do-while a son
role (le repeat until du Pascal à une vache près). Il n'y a aucune
raison de ne pas l'utiliser quand c'est utile. Tu as de drôles de
préjugés parfois...
Je cite un exemple de la faq de developpez.com où tu sévis régulièrement
(mais dont tu n'es pas l'auteur) :
Au contraire. C'est un bon moyen d'éviter que du code C se retrouve par
erreur compilé en C++, ce qui n'est un giganteste UB.
Ton argument est completement tiré par les cheveux. En l'occurrence,
compiler en C++ est souvent un bon moyen de découvrir des problèmes.
Portable avec quoi ?
Avec C++ justement! Si d'aventure tu devais porter des routines C dans une
appli C++, tu serais bien content de ne pas avoir à aller à la pêche aux
mots-clés.
Mais l'argument principal pour moi est la lisibilité : si le lecteur connait
et pratique le C et le C++, voire d'autres dialectes dérivés, l'utilisation
de
mots-clés pour un autre usage ralentit la lecture, voire engendre de
mauvaises interprétations. C est un langage déjà suffisament subtil pour ne
pas rajouter de pièges au lecteur futur.
C'est le programmeur qui est beugué, pas la boucle... do-while a son
role (le repeat until du Pascal à une vache près). Il n'y a aucune
raison de ne pas l'utiliser quand c'est utile. Tu as de drôles de
préjugés parfois...
Je cite un exemple de la faq de developpez.com où tu sévis régulièrement
(mais dont tu n'es pas l'auteur) :
Au contraire. C'est un bon moyen d'éviter que du code C se retrouve par
erreur compilé en C++, ce qui n'est un giganteste UB.
Ton argument est completement tiré par les cheveux. En l'occurrence,
compiler en C++ est souvent un bon moyen de découvrir des problèmes.
Portable avec quoi ?
Avec C++ justement! Si d'aventure tu devais porter des routines C dans une
appli C++, tu serais bien content de ne pas avoir à aller à la pêche aux
mots-clés.
Mais l'argument principal pour moi est la lisibilité : si le lecteur connait
et pratique le C et le C++, voire d'autres dialectes dérivés, l'utilisation
de
mots-clés pour un autre usage ralentit la lecture, voire engendre de
mauvaises interprétations. C est un langage déjà suffisament subtil pour ne
pas rajouter de pièges au lecteur futur.
C'est le programmeur qui est beugué, pas la boucle... do-while a son
role (le repeat until du Pascal à une vache près). Il n'y a aucune
raison de ne pas l'utiliser quand c'est utile. Tu as de drôles de
préjugés parfois...
Je cite un exemple de la faq de developpez.com où tu sévis régulièrement
(mais dont tu n'es pas l'auteur) :
Entierement d'accord. Je l'utilise dans le seul cas de gestion d'erreur.
Entierement d'accord. Je l'utilise dans le seul cas de gestion d'erreur.
Entierement d'accord. Je l'utilise dans le seul cas de gestion d'erreur.
Par contre, il m'est arrivé dans un même projet C++ d'utiliser du code
C, mais bien évidemment dans des sources différents, en en encadrant
les declarations de extern "C"...
Par contre, il m'est arrivé dans un même projet C++ d'utiliser du code
C, mais bien évidemment dans des sources différents, en en encadrant
les declarations de extern "C"...
Par contre, il m'est arrivé dans un même projet C++ d'utiliser du code
C, mais bien évidemment dans des sources différents, en en encadrant
les declarations de extern "C"...