OVH Cloud OVH Cloud

Editer du C++ template avec un editeur de texte

138 réponses
Avatar
Marc Boyer
Bonjour,

une petite question sur vos pratiques d'édition.

Pour écrire la définition de code de classe template, j'aimerais
bien séparer l'interface de l'implémentation.

Mais ça devient très lourd, du genre

template <class T>
typename X<T>::iterator X<T>::first_with(typename X<T>::cond& c){
....
}

alors que si je laisse dans la déclaration de la classe, ça donne
iterator first_with(cond& c);

Je m'en sort à grands coups de
#define X_TEMPLATE template<class T>
#define X X<T>
#define iterator typename X<T>::iterator
#define cond typename X<T>::cond

mais c'est lourd.

Vous faites comment vous ? Un super éditeur/IDE qui cache tout le sucre ?


Et sinon, pourquoi les classes (enfin, mon compilo) ne permettent elle pas
de faire

class X {
void foo(); // Déclaration
...
void foo(){...}; // Implementation
}

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

10 réponses

Avatar
Jean-Marc Bourguet
"K. Ahausse" writes:

a écrit dans le message de
news:


En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur. En


Ha! je suis surpris, edition+compilation


Compilation comme avec emacs, j'aime bien: il ne m'impose rien sur la
structure de mes projets. Pour ce que j'ai vu des IDE c'est
generalement difficile de le faire fonctionner avec un projet deja
structure dont la structure ne correspond pas a celle prevue par les
concepteurs de l'IDE. Ce qui fait que je ne vais generalement pas
tres loin dans l'experimentation de ceux-ci.

debug s'enchainant sur simplement


Pour un tas de raisons que je n'ai pas envie d'expliquer ici, je
prefere de loin m'attacher a un process en cours que de le lancer d'un
debuggeur.

par l'action de touche de fonctions, me semblait le paradis du
développeur.


Le paradis c'est de ne pas avoir a se servir d'un debuggeur. J'y
arrive plus ou moins bien sur du code auquel j'ai participe au
developpement depuis le debut et tant que le probleme n'est pas trop
lie a des dependances -- on utilise beaucoup de callback par exemple,
et c'est une source de problemes -- , tres mal sur du code que je
recupere (et comme c'est la plupart du temps...)

revanche, il faudrait que le « IDE » s'integre bien avec le
système de gestion des versions. Il y a des packages emacs qui le
font, par exemple, au moins pour des outils de gestion des
versions qui fonction un peu comme CVS.



Avec ClearCase, ca s'integre tres bien aussi. J'avais fait du lisp
pour ca parce que naturellement on avait une couche au dessus.

Effectivement. ( cela me fait penser que pressé par le temps je n'ai
pas regarder du coté de 'SourceSafe', a priori, cela devrait
marcher... ).


SourceSafe a apparemment tres mauvaise presse sur le groupe de CM.
(config-mgt ou qqch comme ca, je ne le lis plus).

Ce que je peux dire, c'est qu'évaluer tout ce qui existe coûte
cher en temps.


Oui, 'essuyer les platres', lorsque tant de choses restent à faire,
coûte du temps, sans parler du coup au moral quand on arrive à un
constat d'echec...


Meme sans essuyer les platres. Pour voir si un IDE est utile, il faut
commencer apparemment par restructurer le projet pour etre compatible
avec l'IDE... et comme on a des projets qui sortent sur 11 plateformes
(Sun 32 et 64, HP 32 et 64, IBM 32 et 64, x86, IA64, amd64) il faut
quelque chose qui non seulement soit confortable sur les plateformes
de developpement (mixte Solaris/Linux pour le moment avec quelques
rares exceptions -- et toujours des projets ayant peu de
dependances -- sur Windows mais je ne connais que deux personnes qui
commencent sur un tel projet et pour le moment il n'ont pas vu
d'avantage reel a VC++) mais permette aussi de travailler sur les
autres.

Et que donc, du coup, du moment qu'on a quelque chose qui marche,
même si ce n'est pas optimal, on se contente.


Malheureusement, le risque est de rester coincer, ( comme je peux,
quotidiennement, le constater autour de moi ) avec des outils
complétements dépassés.


Comme?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Jean-Marc Bourguet
Matthieu Moy writes:

writes:

En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur.


C'est pourtant bien pratique : En général, quand tu lances un
déboggueur, la première chose que tu fais, c'est de mettre un
breakpoint (sauf pour débugger un segfault ...). Or, en général, à
ce moment là, j'ai déjà mon éditeur ouvert sur le bon fichier au bon
endroit ...


Je ne vois pas le rapport. Comme ecrit par ailleur, generalement
j'attache le debuggeur au process que j'ai lance a part. (Et
j'utilise soit emacs+dbx soit workshop+dbx -- et je ne vois gere
d'avantage a etre avec workshop par rapport a emacs)

Ensuite, quand tu as bien utilisé le déboggueur, en général, tu
trouves un bug, et tu cherches à le corriger. Et là, si ton
déboggueur tourne dans ton éditeur, tu es déjà au bon endroit pour
pouvoir editer le source.


Dans les deux cas le source est visible dans emacs.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
kanze
Marc Boyer wrote in message
news:<cncgu6$l3m$...
wrote:
Je m'en sort à grands coups de
#define X_TEMPLATE template<class T>
#define X X<T>
#define iterator typename X<T>::iterator
#define cond typename X<T>::cond


J'espère que non. J'appelle ça l'obfuscation.


Pour donner un exemple issu de mon code, sans macro, cela donne:

template<class FSM, template <class, class> class NodeCont,
template <class, class> class ArcCont>
typename StateSpace<FSM, NodeCont, ArcCont>::statespace_arc_iterator
StateSpace<FSM, NodeCont, ArcCont>::arcsBegin() {
.....
}

template<class FSM, template <class, class> class NodeCont,
template <class, class> class ArcCont>
bool
StateSpace<FSM, NodeCont, ArcCont>::find(
const typename StateSpace<FSM, NodeCont, ArcCont>::NodeInfo& info,
typename StateSpace<FSM, NodeCont, ArcCont>::StateSpaceNode* &theNode) {
.....
}

et avec macros

SS_TEMPLATE
statespace_arc_iterator STATE_SPACE::arcsBegin() {
....
}

SS_TEMPLATE
bool STATE_SPACE::find(const NodeInfo& info, StateSpaceNode* &theNode) {
....
}


Et si j'ouvre le fichier à une de ces fonctions, qu'est-ce que je suis
censé à comprendre.

Je suis d'accord que ce que veut le langage, c'est outrement verbeux.
Mais c'est le langage. Je sais le parser. Tandis que SS_TEMPLATE et
STATE_SPACE, c'est quoi ?

À la rigueur, c'est jouable si, et seulement si, c'est une règle de
codage imposé à tout le monde, partout, de façon à ce qu'il soit garanti
que tout le monde qui travaille sur le code le connaît. Et même dans ce
cas-là, j'aimerais des préfixes sur les macros, qui indiquent bien ce
qu'ils font (et qui empèche toute risque de conflit avec d'autre
symboles).

Et évidemment, un #undef quand tu as fini avec eux. (Je me sers des
macros aussi de temps en temps. Régarde par exemple à la fin de
Format.hh, sur ma site.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
K. Ahausse
"Jean-Marc Bourguet" a écrit dans le message de
news:

Compilation comme avec emacs, j'aime bien: il ne m'impose rien sur la
structure de mes projets. Pour ce que j'ai vu des IDE c'est
generalement difficile de le faire fonctionner avec un projet deja
structure dont la structure ne correspond pas a celle prevue par les


[....]


Meme sans essuyer les platres. Pour voir si un IDE est utile, il faut
commencer apparemment par restructurer le projet pour etre compatible
avec l'IDE... et comme on a des projets qui sortent sur 11 plateformes
(Sun 32 et 64, HP 32 et 64, IBM 32 et 64, x86, IA64, amd64) il faut
quelque chose qui non seulement soit confortable sur les plateformes
de developpement (mixte Solaris/Linux pour le moment avec quelques
rares exceptions -- et toujours des projets ayant peu de
dependances --


Les problématiques que j'ai rencontrées sont, à première vue, d'un ordre de
grandeur moindre, et l'effort pour le passage sous l'IDE consentit sans
aucune retenu .


sur Windows mais je ne connais que deux personnes qui
commencent sur un tel projet et pour le moment il n'ont pas vu
d'avantage reel a VC++) mais permette aussi de travailler sur les
autres.


Bon, pourquoi pas ... ( Etant devenu un accro de l'IDE, je pense qu'il sont
passés à coté de quelque chose ... mais mon point de vue est fortement
dévié )


Malheureusement, le risque est de rester coincer, ( comme je peux,
quotidiennement, le constater autour de moi ) avec des outils
complétements dépassés.


Comme?


J'ai autour de moi des personnes qui continuent comme 'aux temps anciens'
d'utiliser leur traitement de texte préféré datant d'avant le graphique, de
compiler à grands coups de batch, ou de scripts, de mettre au point (du
moins sous windows) sans utiliser un debugger symbolique. Cela, au nom du
poids de l'historique, ou, pour d'autres, de la haine que leur inspire la
réussite de microsoft ... quand ce n'est pas les deux.


Avatar
kanze
Marc Boyer wrote in message
news:<cncvi2$nlk$...
In article , drkm wrote:
Marc Boyer writes:

wrote:

J'espère que non. J'appelle ça l'obfuscation.


Pour donner un exemple issu de mon code, sans macro, cela donne:


[...]

Ah, c'est donc de là qu'elle venait, la macro StateSpaceNode ?-)


Oui, et comme un imbécile, j'ai cédé à mon vieux réflexe:
dans un .cpp, on peut définir toutes les macros qu'on veut,
ça reste local.
Sauf qu'en attendant export, ben, je fais un #include du .cpp.


Alors, même à la fin d'un .cpp : #undef. Les macros n'ont pas de scope.
Alors, on la simule.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




Avatar
Marc Boyer
wrote:
Marc Boyer wrote in message
news:<cncvi2$nlk$...
In article , drkm wrote:
Marc Boyer writes:

wrote:

J'espère que non. J'appelle ça l'obfuscation.


Pour donner un exemple issu de mon code, sans macro, cela donne:


[...]

Ah, c'est donc de là qu'elle venait, la macro StateSpaceNode ?-)


Oui, et comme un imbécile, j'ai cédé à mon vieux réflexe:
dans un .cpp, on peut définir toutes les macros qu'on veut,
ça reste local.
Sauf qu'en attendant export, ben, je fais un #include du .cpp.


Alors, même à la fin d'un .cpp : #undef. Les macros n'ont pas de scope.
Alors, on la simule.


Oui, j'ai ajouté tous les #undef qu'il faut là.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.





Avatar
Marc Boyer
wrote:
Marc Boyer wrote in message
news:<cncgu6$l3m$...
wrote:
SS_TEMPLATE
bool STATE_SPACE::find(const NodeInfo& info, StateSpaceNode* &theNode) {
....
}


Et si j'ouvre le fichier à une de ces fonctions, qu'est-ce que je suis
censé à comprendre.


Qu'il faut lire les définitions des macros ;-)

Je suis d'accord que ce que veut le langage, c'est outrement verbeux.
Mais c'est le langage. Je sais le parser. Tandis que SS_TEMPLATE et
STATE_SPACE, c'est quoi ?

À la rigueur, c'est jouable si, et seulement si, c'est une règle de
codage imposé à tout le monde, partout, de façon à ce qu'il soit garanti
que tout le monde qui travaille sur le code le connaît.


Pour l'instant, si une deuxième personne veut toucher à ce code,
je suis prête à enlever toutes les macros ;-)

Et même dans ce
cas-là, j'aimerais des préfixes sur les macros, qui indiquent bien ce
qu'ils font (et qui empèche toute risque de conflit avec d'autre
symboles).


En fait, je ne suis pas vraiment satisfait de cela. Ca m'a aidé
à faire ce que j'avais à faire (extraire l'implémentation), mais
je ne suis pas très satisfait.
La dernière solution que je vois, ce serait un commentaire avec
la version simplifiée de la signature (ie celle qu'on pourrait lire
dans la classe elle même).

Et évidemment, un #undef quand tu as fini avec eux. (Je me sers des
macros aussi de temps en temps. Régarde par exemple à la fin de
Format.hh, sur ma site.)


Oui, ça j'ai ajouté.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Matthieu Moy
Jean-Marc Bourguet writes:

Matthieu Moy writes:

writes:

En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur.


C'est pourtant bien pratique : En général, quand tu lances un
déboggueur, la première chose que tu fais, c'est de mettre un
breakpoint (sauf pour débugger un segfault ...). Or, en général, à
ce moment là, j'ai déjà mon éditeur ouvert sur le bon fichier au bon
endroit ...


Je ne vois pas le rapport.


J'édite toto.cpp, et je veux le débugger.

Chez moi (Emacs+gdb), c'est M-x gdb RET gdb toto RET, puis C-x SPC
pour mettre le breakpoint là ou je suis déjà.

Si j'utilisais un déboggueur lancé à part de mon éditeur, ça serait :

1) lancer le déboggueur
2) ouvrir toto.cpp
3) mettre le breakpoint.

En utilisant un déboggueur lancé directement depuis l'éditeur,
j'économise donc le 2).

Comme ecrit par ailleur, generalement j'attache le debuggeur au
process que j'ai lance a part. (Et j'utilise soit emacs+dbx soit
workshop+dbx -- et je ne vois gere d'avantage a etre avec workshop
par rapport a emacs)


Là, c'est moi qui ne vois pas le rapport ;-) La phrase à laquelle je
réponds n'est pas Emacs Vs Workshop, mais « déboggueur lancé depuis
l'editeur » Vs « reste du monde ».

Ensuite, quand tu as bien utilisé le déboggueur, en général, tu
trouves un bug, et tu cherches à le corriger. Et là, si ton
déboggueur tourne dans ton éditeur, tu es déjà au bon endroit pour
pouvoir editer le source.


Dans les deux cas le source est visible dans emacs.


Oui, mais si tu utilise un déboggeur lancé à part de ton éditeur
(c'est la question à laquelle je répondais, pour rappel), il faut
ouvrir le fichier dans Emacs à moins qu'il ne soit déjà ouvert. Si tu
as un déboggueur dans ton Emacs, le fichier est de toute façons déjà
ouvert à la bonne ligne. (sauf si c'est en débogguant toto.cpp que tu
réalise qu'il y a un bug dans titi.h, mais là, c'est un peu tordu ;-)

--
Matthieu



Avatar
Jean-Marc Bourguet
"K. Ahausse" writes:

"Jean-Marc Bourguet" a écrit dans le message de
news:

Compilation comme avec emacs, j'aime bien: il ne m'impose rien sur la
structure de mes projets. Pour ce que j'ai vu des IDE c'est
generalement difficile de le faire fonctionner avec un projet deja
structure dont la structure ne correspond pas a celle prevue par les


[....]


Meme sans essuyer les platres. Pour voir si un IDE est utile, il faut
commencer apparemment par restructurer le projet pour etre compatible
avec l'IDE... et comme on a des projets qui sortent sur 11 plateformes
(Sun 32 et 64, HP 32 et 64, IBM 32 et 64, x86, IA64, amd64) il faut
quelque chose qui non seulement soit confortable sur les plateformes
de developpement (mixte Solaris/Linux pour le moment avec quelques
rares exceptions -- et toujours des projets ayant peu de
dependances --


Les problématiques que j'ai rencontrées sont, à première vue, d'un
ordre de grandeur moindre, et l'effort pour le passage sous l'IDE
consentit sans aucune retenu .


C'est des projets de quelle taille? Mon experience est plutot pour
des grosses choses (le programme sur lequel je suis pour le moment
approche les 100 millions de lignes, est delivre sur les 11
plateformes ci-dessus, maintenu en 6 versions -- la future, l'actuelle
et la precedante sur deux infrastructures -- par des equipes sur je ne
sais pas combien de sites) et doit se transposer assez mal aux petits
projets independants. Tout changement (meme de version de
compilateur, ce qui est simple au point de vue du systeme de build
mais les gens qui s'occupent de ca fournissent generalement une liste
plus ou moins longue de patchs necessaires pour que tout fonctionne
bien) est un effort au moins de validation.

sur Windows mais je ne connais que deux personnes qui commencent
sur un tel projet et pour le moment il n'ont pas vu d'avantage
reel a VC++) mais permette aussi de travailler sur les autres.


Bon, pourquoi pas ... ( Etant devenu un accro de l'IDE, je pense
qu'il sont passés à coté de quelque chose ... mais mon point de vue
est fortement dévié )


Tout ce qu'on m'a presente jusqu'a present comme avantage est
disponible avec emacs ou ne tient pas le choc de la taille de notre
code. D'accord, l'UI n'est peut-etre pas aussi belle que possible,
mais j'ai pas encore vu mieux en matiere de customisation sauf
peut-etre notre programme...

Malheureusement, le risque est de rester coincer, ( comme je
peux, quotidiennement, le constater autour de moi ) avec des
outils complétements dépassés.


Comme?


J'ai autour de moi des personnes qui continuent comme 'aux temps
anciens' d'utiliser leur traitement de texte préféré datant d'avant
le graphique,


Si tu parles de LaTeX, c'est peut-etre toi qui perds quelque chose.
Il est peut-etre possible d'optenir un document coherent avec Word,
mais la derniere fois que j'ai regarde ca demandais plus de travail
qu'avec LaTeX (une fois l'investissement de le maitriser fait -- ce
qui est apparemment le cas des gens dont tu parles. Et si tu as des
maths, n'en parlons pas.

de compiler à grands coups de batch, ou de scripts,


Jamais vu personne utiliser quelque chose de moins evolue que make.
Et j'ai rien vu de suffisemment meilleur pour valoir la peine de
changer.

de mettre au point (du moins sous windows) sans utiliser un debugger
symbolique.


En utilisant un debuggeur non symbolique ou sans utiliser de debuggeur
du tout? La seconde alternative me semble viable (c'est
principalement comme ca que je fonctionne sur mes petits projets
perso). La premiere tient du masochisme.

Cela, au nom du poids de l'historique,


Ne sousestime pas le cout du changement. Ni la puissance d'outils que
tu ne maitrises pas. Question debuggeur, j'en connais qui regrettent
encore celui qu'ils utilisaient il y a 7 ou 8 ans, et pas sans raisons
apparemment (je ne l'ai pas utilise assez).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Jean-Marc Bourguet
Matthieu Moy writes:

Jean-Marc Bourguet writes:

Matthieu Moy writes:

writes:

En ce qui concerne les autres fonctionalités, ça ne m'interesse en rien
de pouvoir lancer le déboggueur directement depuis l'éditeur.


C'est pourtant bien pratique : En général, quand tu lances un
déboggueur, la première chose que tu fais, c'est de mettre un
breakpoint (sauf pour débugger un segfault ...). Or, en général, à
ce moment là, j'ai déjà mon éditeur ouvert sur le bon fichier au bon
endroit ...


Je ne vois pas le rapport.


J'édite toto.cpp, et je veux le débugger.

Chez moi (Emacs+gdb), c'est M-x gdb RET gdb toto RET, puis C-x SPC
pour mettre le breakpoint là ou je suis déjà.


Non. Chez moi le buffer du debugger est le seul dans la fenetre. Il
faut changer de buffer.

Si j'utilisais un déboggueur lancé à part de mon éditeur, ça serait :

1) lancer le déboggueur


2/ break la_fonction

C'est rare que j'ai besoin d'autres choses. C'est ce que je fais
aussi dans emacs.

2) ouvrir toto.cpp
3) mettre le breakpoint.

En utilisant un déboggueur lancé directement depuis l'éditeur,
j'économise donc le 2).


Rien vu d'economie.

Comme ecrit par ailleur, generalement j'attache le debuggeur au
process que j'ai lance a part. (Et j'utilise soit emacs+dbx soit
workshop+dbx -- et je ne vois gere d'avantage a etre avec workshop
par rapport a emacs)


Là, c'est moi qui ne vois pas le rapport ;-) La phrase à laquelle je
réponds n'est pas Emacs Vs Workshop, mais « déboggueur lancé depuis
l'editeur » Vs « reste du monde ».


Reste du monde comprend "editeur lance depuis le debuggeur". Ce qui
est le cas pour workshop :-) Mais j'avais mal compris ta position.

Ensuite, quand tu as bien utilisé le déboggueur, en général, tu
trouves un bug, et tu cherches à le corriger. Et là, si ton
déboggueur tourne dans ton éditeur, tu es déjà au bon endroit pour
pouvoir editer le source.


Dans les deux cas le source est visible dans emacs.


Oui, mais si tu utilise un déboggeur lancé à part de ton éditeur
(c'est la question à laquelle je répondais, pour rappel), il faut
ouvrir le fichier dans Emacs à moins qu'il ne soit déjà ouvert. Si tu
as un déboggueur dans ton Emacs, le fichier est de toute façons déjà
ouvert à la bonne ligne. (sauf si c'est en débogguant toto.cpp que tu
réalise qu'il y a un bug dans titi.h, mais là, c'est un peu tordu ;-)


Les problemes qui sont ou je m'y attends, je n'ai pas besoin de
debuggeur, la lecture du code suffit. Mes problemes principaux avec
le code que j'ecrit, c'est les fonctions qui ne se comportent pas
comme documentes et les callbacks qui interviennent avec des effets
inattendus. Donc generalement c'est dans un fichier que je n'ai pas
ouvert (et assez souvent dans une bibliotheque qui n'est pas en
debug...)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org