OVH Cloud OVH Cloud

const int NULL = 0

39 réponses
Avatar
Philippe Mesmeur
Bonjours à tous,

Dans la Bible, l'ami Stroustrup conseil d'utiliser 0 à la place de NULL.
Il indique également pour ceux qui voudraient continuer à utiliser NULL d'en
faire la déclaration suivante:

  const int NULL = 0;

Cependant, j'ai peur qu'en faisant une telle déclaration dans un .hpp, le
compilateur me cré un symbole (au sens "linkage" du terme) pour la
constante (i.e. une sorte de variable globale non-modifiable) par
fichier .cpp incluant le fameux header.

Au final, l'étape de link risque d'etre douloureuse!!!!

Apres quelques tests (un peu trop à la va-vite je dois l'avouer) il
semblerait que:

- GCC) arrive linker SI la variable est "const" dans le cas contraire, il
n'y parvient pas!!!

- Visual 6.0) n'arrive jamais à linker

Avez vous des info à ce sujet? est-ce GCC qui fait des optimisations dans
certains cas? est-ce Visual 6.0 qui a une/des limitation(s) à se sujet?
Est-ce moi qui ai mal fait mes tests ("vite fait mal fait")?


De plus je pense que sa proposition est assez moyenne car meme si je peux -
dans un de mes headers - redéfinir NULL par "const int NULL = 0;" je cours
de grands risques avec l'inclusion de headers standards: mon NULL rentrera
en conflit avec le NULL standard et se dernier remplacera le miens au
préprocessing pour me donner un résultat assez ... tordu!!!

Ou alors:
  - je peux faire avant ma définition un #undef NULL
  - je peux faire mon propre NULL: "const int MYNULL = 0;"

Merci de votre réaction

Philippe

10 réponses

1 2 3 4
Avatar
Gabriel Dos Reis
writes:

| > Il indique également pour ceux qui voudraient continuer à
| > utiliser NULL d'en faire la déclaration suivante:
|
| > const int NULL = 0;
|
| C'est illégal, au moins si tu inclus le moindre en-tête. Ne le
| fais pas, en aucun cas.

C'est invalide seulement s'il inclut un en-tête standard. Mais s'il
n'en inclut pas ?

À lire le message de Philippe, il s'intérroge, entre autres, sur
d'éventuels problèmes de liaison posés par quelque chose comme

const int foo = 0;

dans un fichier d'en-tête qu'on inclut dans différents fichiers
d'implémentation faisant partie d'un programme.
Dans son message, foo était NULL mais la phrase clé en ce qui concerne
le problème de liaison est :

# Cependant, j'ai peur qu'en faisant une telle déclaration dans un .hpp, le
# compilateur me cré un symbole (au sens "linkage" du terme) pour la
# constante (i.e. une sorte de variable globale non-modifiable) par
# fichier .cpp incluant le fameux header.
#
# Au final, l'étape de link risque d'etre douloureuse!!!!

| Si tu veux utiliser NULL, il n'y a qu'une seule façon de
| l'avoir :
|
| #include <stddef.h>
|
| (OK, il y en a plusieurs, parce qu'à la place de <stddef.h>, tu
| peux utiliser <cstddef>, <stdlib.h>, <stdio.h>, ...)
|
| NULL fait partie de la norme. C'est du C++ standard. Tu n'as pas
| le droit de le définir toi-même.

Puisque tu es distrait par NULL, s/NULL/foo/ et recommence.

[...]

| > (i.e. une sorte de variable globale non-modifiable) par
| > fichier .cpp incluant le fameux header.
|
| Il « crée » ce que tu lui démande, c-à-d une variable const de
| type int, sans linkage.

chapitres et versets ?

-- Gaby
Avatar
Falk Tannhäuser
Gabriel Dos Reis wrote:
writes:
| Ça dépend. C'est un comportement indéfini selon la norme. Donc,
| quoiqu'en fasse le compilateur, il a raison.

Bof. Si mon programme est

const int NULL = 0;
int main() { return NULL; }

où est le comportement indéfini ?


Dès qu'on inclut <cstddef> ou <stddef.h>,
ou une autre en-tête qui inclut une de ces
2, directement ou indirectement (ce qui
peut être le cas pour n'importe quelle
en-tête standard, si mes souvenirs sont bons)...

Pour éviter un comportement indéfini en la présence
d'un identificateur NULL fourni par l'utilisateur, il
faudrait donc ne pas inclure d'en-têtes standard - ce
qui limite quelque peu ce qu'on peut faire dans son
programme (il est vrai qu'on peut implémenter les
utilitaires Unix 'true' et 'false' [voir
<http://www.miketaylor.org.uk/tech/oreilly/truenut.html>]
sans inclure d'en-têtes standard, mais à part de ça...)

Falk

Avatar
Gabriel Dos Reis
Falk Tannhäuser writes:

| Gabriel Dos Reis wrote:
| > writes:
| > | Ça dépend. C'est un comportement indéfini selon la norme. Donc,
| > | quoiqu'en fasse le compilateur, il a raison.
| > Bof. Si mon programme est const int NULL = 0;
| > int main() { return NULL; }
| > où est le comportement indéfini ?
|
| Dès qu'on inclut <cstddef> ou <stddef.h>,
| ou une autre en-tête qui inclut une de ces
| 2, directement ou indirectement (ce qui
| peut être le cas pour n'importe quelle
| en-tête standard, si mes souvenirs sont bons)...

Je suis au courant de tout ça (comme tu pourrais le constater dans
plusieurs de mes messages) et comme tu as pu le voir, le programme
que j'ai présenté n'inclus rien de ça. Alors ?

Hint : la question contenait sa réponse.

-- Gaby
Avatar
Olivier Azeau
Gabriel Dos Reis wrote:
Bof. Si mon programme est

const int NULL = 0;
int main() { return NULL; }


VC 6.0 n'a pas de probleme avec ce programme ;-)

Avatar
Ivan Vecerina
"Fabien LE LEZ" wrote in message
news:
On Fri, 4 Feb 2005 06:55:50 +0100, "Ivan Vecerina"
:

Pour ma part, j'utilise tout simplement 00 quand la valeur
représente un pointeur


Une notation octale pour un pointeur ?


Savais-tu que le simple '0' est également une notation octale?

Selon la grammaire du C, reprise en C++:
integer-constant:
decimal-constant integer-suffixopt
octal-constant integer-suffixopt
hexadecimal-constant integer-suffixopt
decimal-constant:
nonzero-digit
decimal-constant digit
octal-constant:
0
octal-constant octal-digit


;-)


;) ;)

--
http://ivan.vecerina.com/contact/?subject=NG_POST <- email contact form


Avatar
kanze
Gabriel Dos Reis wrote:
writes:

| > Il indique également pour ceux qui voudraient continuer à
| > utiliser NULL d'en faire la déclaration suivante:

| > const int NULL = 0;

| C'est illégal, au moins si tu inclus le moindre en-tête. Ne
| le fais pas, en aucun cas.

C'est invalide seulement s'il inclut un en-tête standard. Mais
s'il n'en inclut pas ?


Je vois que tu t'es lancé dans ta masturbation mentale
habituelle. Qu'importe ce qui est utile, ou qui pourrait servir,
pourvu que tu marques des points.

Si on n'inclut aucun en-tête, c'est légal. Et alors ? En quoi
est-ce que tu es avancé ?

À lire le message de Philippe, il s'intérroge, entre autres,
sur d'éventuels problèmes de liaison posés par quelque chose
comme

const int foo = 0;

dans un fichier d'en-tête qu'on inclut dans différents
fichiers d'implémentation faisant partie d'un programme. Dans
son message, foo était NULL mais la phrase clé en ce qui
concerne le problème de liaison est :

# Cependant, j'ai peur qu'en faisant une telle déclaration
# dans un .hpp, le compilateur me cré un symbole (au sens
# "linkage" du terme) pour la constante (i.e. une sorte de
# variable globale non-modifiable) par fichier .cpp incluant
# le fameux header.

# Au final, l'étape de link risque d'etre douloureuse!!!!


Et alors ? Le commentaire est un peu idiot, parce qu'évidemment,
aucun compilateur ne ferait un problème à l'édition de liens, si
jamais le code compile. Mais ça ne change rien au fond : si tu
veux utiliser NULL, il y a une façon standard de le faire, et
une seule.

| Si tu veux utiliser NULL, il n'y a qu'une seule façon de
| l'avoir :

| #include <stddef.h>

| (OK, il y en a plusieurs, parce qu'à la place de <stddef.h>,
| tu peux utiliser <cstddef>, <stdlib.h>, <stdio.h>, ...)

| NULL fait partie de la norme. C'est du C++ standard. Tu n'as
| pas le droit de le définir toi-même.

Puisque tu es distrait par NULL, s/NULL/foo/ et recommence.


Comment suis-je distrait ? Où est-ce que tu vois un problème
avec foo ? La question s'est posée sur NULL ; si tu veux poser
une autre question, dis-le. Mais alors, ça serait mieux de
changer le sujet, voire même ouvrir un autre fils.

[...]

| > (i.e. une sorte de variable globale non-modifiable) par
| > fichier .cpp incluant le fameux header.

| Il « crée » ce que tu lui démande, c-à-d une variable const
| de type int, sans linkage.

chapitres et versets ?


D'accord, c'est linkage interne. Dans la pratique, ça revient au
même pour la plupart des utilisateurs.

--
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
kanze
Gabriel Dos Reis wrote:
writes:

| Gabriel Dos Reis wrote:
| > Philippe Mesmeur writes:

| > | Dans la Bible, l'ami Stroustrup conseil d'utiliser 0 à
| > | la place de NULL. Il indique également pour ceux qui
| > | voudraient continuer à utiliser NULL d'en faire la
| > | déclaration suivante:

| > | const int NULL = 0;

| > | Cependant, j'ai peur qu'en faisant une telle déclaration
| > | dans un .hpp, le compilateur me cré un symbole (au sens
| > | "linkage" du terme) pour la constante (i.e. une sorte de
| > | variable globale non-modifiable) par fichier .cpp
| > | incluant le fameux header.

| > should not happen.

| Ça dépend. C'est un comportement indéfini selon la norme.
| Donc, quoiqu'en fasse le compilateur, il a raison.

Bof. Si mon programme est

const int NULL = 0;
int main() { return NULL; }

où est le comportement indéfini ?


Et où est l'intérêt ?

Bon, d'accord. C'est c'est la complexité moyenne de tes
programmes, je comprends pourquoi tu ne ressens pas la nécessité
de l'UML ou d'autres outils de conception. Mais j'avoue qu'une
fois de plus, je me suis pas rendu compte de la diversité des
utilisations du C++, et il ne m'était pas venu à l'esprit qu'il
y avait des gens qui écrivaient réelement des choses aussi
simples.

Donc, je réformule : Si tu n'as pas besoin des la bibliothèque
standard ; si tu trouves qu'il n'y a aucun intérêt dans la STL ;
si tu le trouves plus intelligent de réécrire tout le formattage
des entrées/sorties (ou si tes programmes ne font pas
d'entrées/sorties), c'est un conseil peut-être acceptable.

Dans tout autre cas, l'utilisation de :
const int NULL = 0 ;
est inacceptable, et donnerait un comportement indéfini.

| Si le nom est NIL, ou NUL, ou quelque chose d'autre,
| évidemment, il doit pas y avoir de problème.

| > | Au final, l'étape de link risque d'etre douloureuse!!!!

| > Non.

| > | Apres quelques tests (un peu trop à la va-vite je dois
| > | l'avouer) il semblerait que:

| > | - GCC) arrive linker SI la variable est "const" dans le
| > | cas contraire, il n'y parvient pas!!!

| > Oui, et c'est ce que demande C++ depuis très longtemps. C'est
| > pour ça qu'il a dit

| > const int NULL = 0;

| > et non

| > int NULL = 0;

| > Chaque mot a son importance.

| Je crois que l'intérêt principal du const ici, c'est pour
| qu'on n'écrive pas NULL = 3 dans une fonction par erreur.

C'est que tu n'as pas encore compris « const », mais ce n'est
pas grave. Voir plus bas.


Je connais bien les règles en ce qui concerne const. Y compris
la règle idiote qui lui donne un autre linkage que des
non-const. (C'est encore surcharger des choses qui n'ont rien à
voir.) Mais l'« intérêt principal » du const, ici ou ailleurs,
c'est d'empècher qu'on y écrit. Si le but n'était que de
s'assurer d'un linkage interne, il existe le mot clé static.

Un bon programmeur, qui s'intéresse à la lisibilité de ses
programmes, mettrait systèmatiquement le mot clé static aussi ;
s'il connaît les irrégularités de la règle, je ne vois pas
pourquoi il tiendrait à cacher le fait du lecteur. Mais bon, je
conçois bien que c'est un aspect que tu es incapable de
comprendre.

| Évidemment, ça serait plus cohérent d'écrire :
| static int const toto = 0 ;
| pour que le linkage soit apparent.

| > | - Visual 6.0) n'arrive jamais à linker

| > Visual 6.0 n'arrive pas à faire beaucoup de choses.

| Tu t'en es réelement servi, ou tu répètes des maudisances.
| Je connais des gens qui font beaucoup avec VC++ 6.0.

oui mais en quoi cela est-il en contradiction avec « n'arrive
pas à faire beaucoup de choses » ?


Donc, en fait, ton commentaire n'a rien à voir avec le problème
en question. (Moi, je trouve qu'on peut faire beaucoup de chose
avec VC++ aussi, s'il le faut. C'est loin d'être un outil
parfait, mais c'est loin d'être inutilisable aussi.)

| En fait, il n'y a pas de problème ici avec VC++.

Huh.


Repétons, pour être sûr qu'on parle de la même chose : il s'agit
de la déclaration :
int const NULL = 0 ;
dans un en-tête (et donc, qui apparaît dans plusieurs unités de
compilation). En supposant qu'on ne se heurte pas à un conflit
avec la définition standard (un comportement indéfini, mais qui
donnerait plutôt une erreur à la compilation, au moins avec VC++
6.0), cette declaration ne pose aucun problème pour VC++. Il le
traite de façon parfaitement standard. Comme tous les autres
compilateurs que je connais.

Ou est-ce que tu as une information contraire ? (J'avoue que je
ne l'ai essayé qu'avec VC++ 6.0. Je ne peux donc pas totalement
exclure qu'il y a une regression, et que ça ne fonctionne pas
correctement avec des versions plus récentes. Mais franchement,
ça m'étonnerait.)

| > | De plus je pense que sa proposition est assez moyenne
| > | car meme si je peux - dans un de mes headers - redéfinir
| > | NULL par "const int NULL = 0;" je cours de grands
| > | risques avec l'inclusion de headers standards: mon NULL
| > | rentrera en conflit avec le NULL standard et se dernier
| > | remplacera le miens au préprocessing pour me donner un
| > | résultat assez ... tordu!!!

| > Oui. Mais alors peux-tu citer exactement ce qu'il a écrit ?

| Je serais intéressé aussi.

Tu est fatigant.


Pourquoi ? Parce que l'erreur est si grosse, que j'imagine qu'il
y a un mal-entendu quelque part.


http://groups-beta.google.com/group/fr.comp.lang.c++/messages/e3876e147ea41 420,ae88d5df21c44df7,ae96d6d557729a52,ffb50bfd02464a9a,f08293fccfc8d97a,9da ea3cce0b66b85,1ff90b08d68dfd2a,6865364935c336aa,45d9bbbebdd7e6c4,3cd7a2e539 b45d99?thread_id…3999f7d9420178&mode=thread&noheader=1&q=if+you+f eel+you+must+group:fr.comp.lang.c%2B%2B#doc_ae88d5df21c44df7


Un certain KANZE James y est abondamment intervenu. Toute
ressemblance est une pure coincidence.


Je ne vois rien là qui ne dit plus que ce que tu n'es dis ici.
Surtout, il n'était pas question là non plus du contexte. Et en
défendant Stroustrup, tu y as choisi de jouer sur des mots,
plutôt que de s'adresser à la question réele de ce qu'il
conseille réelement.

Si je rélis la phrase telle qu'on la cite dans les deux threads,
j'ai bien l'impression qu'il suggère l'utilisation de la
declaration illégale *SI* on choisit d'utiliser NULL. Or, moi,
je ne connais Stroustrup que de très loin, mais je sais qu'il
tient Kernighan et Richie en estîme. C'est donc qu'il considère
bien que certaines personnes puissent préférer NULL. Alors,
j'aimerais bien comprendre. Je suppose que c'est un malentendu ;
que Stroustrup a bien écrit quelque chose de différent, ou qu'il
y a un contexte qu'on ne voit pas qui fait comprendre ses mots
dans un autre sens.

--
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
Jean-Marc Bourguet
TC++PL, 3rd Edition, 4th printing (j'ai pas vu d'errata pour ca). Les
_xxx_ indiquent de l'italique dans le texte, il n'y a pas d'undescore
dans la partie citee.


5.1.1 Zero

Zero (0) is an _int_. Because of standard conversions (C.6.2.3), 0
can be used as a constant of any integral (4.1.1), floating-point,
pointer or pointer-to-member type. The type of zero will be
determined by context. Zero will typically (but not necessarily) be
represented by the bit pattern _all-zeros_ of the appropriate size.

No object is allocated with the address _0_. Consequently, 0 act as
pointer literal, indicating that a pointer doesn't refer to an object.

In C, it has been popular to define a macro _NULL_ to represent the
zero pointer. Because of C++'s tigher type checking, the use of plain
_0_, rather than any suggested _NULL_ macro, leads to fewer problems.
If you feel you must define _NULL_, use

const int NULL = 0;

The _const_ qualifier (5.4) prevents accidental redefinition of _NULL_
and ensures that _NULL_ can be used where a constant is required.


B.S. ne suggere pas que ceux qui utilisent NULL le definissent, mais
que ceux qui le definissent le fassent comme indique. Perso j'aurais
quand meme signale que ca pose un probleme des qu'on inclu un entete
standard.

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
Gabriel Dos Reis
writes:

| Gabriel Dos Reis wrote:
| > writes:
|
| > | Gabriel Dos Reis wrote:
| > | > Philippe Mesmeur writes:
|
| > | > | Dans la Bible, l'ami Stroustrup conseil d'utiliser 0 à
| > | > | la place de NULL. Il indique également pour ceux qui
| > | > | voudraient continuer à utiliser NULL d'en faire la
| > | > | déclaration suivante:
|
| > | > | const int NULL = 0;
|
| > | > | Cependant, j'ai peur qu'en faisant une telle déclaration
| > | > | dans un .hpp, le compilateur me cré un symbole (au sens
| > | > | "linkage" du terme) pour la constante (i.e. une sorte de
| > | > | variable globale non-modifiable) par fichier .cpp
| > | > | incluant le fameux header.
|
| > | > should not happen.
|
| > | Ça dépend. C'est un comportement indéfini selon la norme.
| > | Donc, quoiqu'en fasse le compilateur, il a raison.
|
| > Bof. Si mon programme est
|
| > const int NULL = 0;
| > int main() { return NULL; }
|
| > où est le comportement indéfini ?
|
| Et où est l'intérêt ?

Contre-exemple à ton affirmation erronnée. Mais comme tu n'as jamais
dit des bêtises, tu n'en vois pas l'intérêt n'est-ce pas ?

| Bon, d'accord. C'est c'est la complexité moyenne de tes
| programmes,

et elle semble être inversement proportionnelle à tes âneries.

[...]

| > | > Oui, et c'est ce que demande C++ depuis très longtemps. C'est
| > | > pour ça qu'il a dit
|
| > | > const int NULL = 0;
|
| > | > et non
|
| > | > int NULL = 0;
|
| > | > Chaque mot a son importance.
|
| > | Je crois que l'intérêt principal du const ici, c'est pour
| > | qu'on n'écrive pas NULL = 3 dans une fonction par erreur.
|
| > C'est que tu n'as pas encore compris « const », mais ce n'est
| > pas grave. Voir plus bas.
|
| Je connais bien les règles en ce qui concerne const. Y compris

Bah apparamment non, puisque tu continue à énoncer des stupidités.

| la règle idiote qui lui donne un autre linkage que des
| non-const. (C'est encore surcharger des choses qui n'ont rien à
| voir.)

Une fois de plus, tu es à l'envers mais je suis à peine surpris.

| Mais l'« intérêt principal » du const, ici ou ailleurs,
| c'est d'empècher qu'on y écrit. Si le but n'était que de
| s'assurer d'un linkage interne, il existe le mot clé static.

C'est là la règle idiote : celle qui consiste à surcharger « static »
avec la signification que le linkage est interne.

« static » dès le début a toujours voulu dire « au plus une seule
instance dans le programme », et non un linkage interne. C++ a maintenu
cette signification et étendud cette notion avec celle de « donnée
membre statique », il y a deux décennies.

Mais, certaines personnes ont perverti ce sens en le surchargeant avec
la notion de linkage. Avec l'inroduction des namespaces, il a été
tenté (avc un succès modéré) de revenir à la signification originelle
de « static » en déclarant que l'utilisation de « static » pour
siginifier linkage interne dans certaines est dépréciée.


Cela ne fait que la n-ième fois, mais visiblement tu comprends vite
quand on t'explique longtemps.

| Un bon programmeur, qui s'intéresse à la lisibilité de ses
| programmes, mettrait systèmatiquement le mot clé static aussi ;

Un bon programmeur connaît et utilise les constructions
idiomatiques. Et l'idiome, consacré depuis plus de deux décennies,
est qu'une variable const par défaut implique un linkage interne, à
porté globale (puis namespace plus tard).

Le programmeur « qui ne s'intéresse pas à la lisibilité de ses
programmes » et qui a inventé const en C++ il y a plus de deux
décennies a expliqué pourquoi il l'a inventé const et comment il
est arrivé à la règle en question dans D&E.

| s'il connaît les irrégularités de la règle, je ne vois pas
| pourquoi il tiendrait à cacher le fait du lecteur. Mais bon, je
| conçois bien que c'est un aspect que tu es incapable de
| comprendre.

incapable de comprendre que tu sois aussi stupide jusqu'à écrire
autant de conneries sur « const », qu'on peut vérifier ? Oui.

[...]

|
| > | > Oui. Mais alors peux-tu citer exactement ce qu'il a écrit ?
|
| > | Je serais intéressé aussi.
| >
| > Tu est fatigant.
|
| Pourquoi ?

Parce que tu peux avoir la rèponse par un simple clic.

| Parce que l'erreur est si grosse, que j'imagine qu'il
| y a un mal-entendu quelque part.

La phrase clé est « if you feel you must ». C'est ça que tu ne
comprends pas et qui est ton malentendu ?

| >
| http://groups-beta.google.com/group/fr.comp.lang.c++/messages/e3876e147ea41420,ae88d5df21c44df7,ae96d6d557729a52,ffb50bfd02464a9a,f08293fccfc8d97a,9daea3cce0b66b85,1ff90b08d68dfd2a,6865364935c336aa,45d9bbbebdd7e6c4,3cd7a2e539b45d99?thread_idÂ…3999f7d9420178&mode=thread&noheader=1&q=if+you+feel+you+must+group:fr.comp.lang.c%2B%2B#doc_ae88d5df21c44df7
|
| > Un certain KANZE James y est abondamment intervenu. Toute
| > ressemblance est une pure coincidence.
|
| Je ne vois rien là qui ne dit plus que ce que tu n'es dis ici.

Comme « if you feel you must » ?

-- Gaby
Avatar
Gabriel Dos Reis
writes:

| Gabriel Dos Reis wrote:
| > writes:
|
| > | > Il indique également pour ceux qui voudraient continuer à
| > | > utiliser NULL d'en faire la déclaration suivante:
|
| > | > const int NULL = 0;
|
| > | C'est illégal, au moins si tu inclus le moindre en-tête. Ne
| > | le fais pas, en aucun cas.
|
| > C'est invalide seulement s'il inclut un en-tête standard. Mais
| > s'il n'en inclut pas ?
|
| Je vois que tu t'es lancé dans ta masturbation mentale
| habituelle.

il faut dire que tu t'y mettais avec autant d'entrain et de plaisir
que tu m'as fait envie. Tu es jaloux ?

| Qu'importe ce qui est utile, ou qui pourrait servir,
| pourvu que tu marques des points.

C'est assez révélateur de ta mentalité : marquer des points.

Avec toi, ce serait trop facile et c'est probablement illégal.
Alors sache que c'est juste pour te voir aligner des âneries et non
pour marquer des points. C'est illégal aussi ?

| Si on n'inclut aucun en-tête, c'est légal. Et alors ? En quoi
| est-ce que tu es avancé ?

Cela ne te regarde pas.

-- Gaby
1 2 3 4