Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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
Philippe Mesmeur writes:

| 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.

should not happen.

| 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.

| - Visual 6.0) n'arrive jamais à linker

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


| 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 ?

-- Gaby
Avatar
Ivan Vecerina
"Philippe Mesmeur" wrote in message
news:4202b6c2$0$4799$
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)
...

- Visual 6.0) n'arrive jamais à linker
Faute à sa non-conformité avec le standard C++.

Si une portabilité sur de tels compilateurs est désirable,
une alternative est:
enum { NULL=0 };

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


J'éviterai effectivement tout court d'utiliser l'identifiant NULL.
Cette macro n'apporte rien, et n'est à mon avis pas plus
judicieuse que... disons:
#define IF(x) if(x) {
#define END_IF }

Certes, une notation permettant de distinguer 'nul' de 'zéro'
peut avoir des avantages.
Pour ma part, j'utilise tout simplement 00 quand la valeur
représente un pointeur, comme j'écris 0.0 pour une constante
double. NULL est purement et simplement sorti de mon vocabulaire,
et c'est l'option que je, modestement, je recommande également.

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

Avatar
PurL
NULL est purement et simplement sorti de mon vocabulaire,


Pourquoi ? NULL ne vaut-il pas zero ?

PurL

Avatar
kanze
Philippe Mesmeur wrote:

Dans la Bible, l'ami Stroustrup conseil d'utiliser 0 à la
place de NULL.


C'est son avis. C'est une question où les avis sont partagés.

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.

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.

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


NULL est un symbole. C'est ce que tu veux, non ?

(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. Dans les faits, je ne connais aucun
compilateur qui ne l'alloue si on n'en prend pas l'adresse.

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


Pourquoi ? C'est un symbol sans linkage, que l'éditeur de liens
ne voit pas.

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!!!


C'est une des irrégularités de C++. Le linkage par défaut d'une
variable à la portée d'un espèce référentiel dépend de ce
qu'elle est const ou non.

- Visual 6.0) n'arrive jamais à linker


Chez moi si. Je m'en suis servi pas mal sans problème.

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")?


Le dernier, sans doute. À moins que ce soit un problème suite au
comportement indéfini. Définir NULL, c'est illégal, mais si tu
essaies NUL ou NIL, ça ne doit pas poser de problèmes.

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!!!


Il donnera un résultat indéfini selon la norme. C'est illégal.

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


Inclure <stddef.h>. C'est la solution standard.

--
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
Fabien LE LEZ
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 ?


--
;-)

Avatar
kanze
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.

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.

É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.

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

| 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. Parce qu'en général, Stroustrup est
assez bien à ne pas présenter des opinions comme des vérités
absolues. Je m'attendrais donc quelque chose du genre
"Personally, I prefer ..." avant un conseil d'utiliser 0 plutôt
que NULL.

--
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
Ivan Vecerina wrote:
"Philippe Mesmeur" wrote in message
news:4202b6c2$0$4799$
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)
...

- Visual 6.0) n'arrive jamais à linker


Faute à sa non-conformité avec le standard C++.


Faute à savoir s'en servir, peut-être. VC++ 6.0 est bien plus
conforme que la plupart de ses contemporains, et traite ce
cas-ci (que la norme n'a pas changé par rapport à l'ARM)
correctement.

(Évidemment, je fais abstraction que le code en question
introduit un comportement indéfini dans le programme, et que
donc, tout ce que peut faire le compilateur est conforme.)

Si une portabilité sur de tels compilateurs est désirable, une
alternative est:
enum { NULL=0 };


Aussi illégal (et donc, comportement indéfini).

La norme dit que NULL est un macro. L'utilisateur n'a donc pas
droit de le rédéfinir.

[...]
J'éviterai effectivement tout court d'utiliser l'identifiant
NULL. Cette macro n'apporte rien, et n'est à mon avis pas plus
judicieuse que... disons:

#define IF(x) if(x) {
#define END_IF }


Au différence près que c'est du C++ standard. Il y a des
arguments pour et contre -- je crois que le comité travail sur
une solution réele, mais en attendant, utiliser NULL a certains
défauts, utiliser 0 en a d'autres, et on n'a pas réelement
d'autres alternatifs.

Certes, une notation permettant de distinguer 'nul' de 'zéro'
peut avoir des avantages.

Pour ma part, j'utilise tout simplement 00 quand la valeur
représente un pointeur, comme j'écris 0.0 pour une constante
double.


Le problème avec celà, c'est que personne d'autre ne le fait.

NULL est purement et simplement sorti de mon vocabulaire, et
c'est l'option que je, modestement, je recommande également.


C'est une option possible. J'ai choisi l'autre, mais je
reconnais bien qu'il y a des arguments des deux côtés.

En attendant, si tu veux lire le C++, il faut comprendre les
deux écritures, parce que tu vas les voir.

--
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
Falk Tannhäuser
Ivan Vecerina wrote:
J'éviterai effectivement tout court d'utiliser l'identifiant NULL.
Cette macro n'apporte rien [...]
Certes, une notation permettant de distinguer 'nul' de 'zéro'
peut avoir des avantages.
Pour ma part, j'utilise tout simplement 00 quand la valeur
représente un pointeur, comme j'écris 0.0 pour une constante
double. NULL est purement et simplement sorti de mon vocabulaire,
et c'est l'option que je, modestement, je recommande également.


Il est vrai que NULL, tel que défini par la Norme, doit être
accepté non seulement comme pointeur, mais aussi dans les
contextes où on attend un entier...
Il n'y cependant rien qui empêche le compilateur d'emettre un
warning si NULL est ainsi abusé - dans le fichier d'en-tête
stddef.h fourni avec gcc, ce macro est défini comme
#define NULL __null
ce qui permet d'avoir un warning du genre "passing NULL used for
non-pointer converting 1 of `void foo(int)'" même dans des cas "piège "
comme

void foo(int);
void foo(void const*);
...
foo(NULL);

Falk

Avatar
Gabriel Dos Reis
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 ?

| 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.

| É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 » ?

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

Huh.

| > | 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.

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.

-- Gaby
Avatar
Gabriel Dos Reis
writes:

| Ivan Vecerina wrote:
| > "Philippe Mesmeur" wrote in message
| > news:4202b6c2$0$4799$
| > > 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)
| > ...
| > > - Visual 6.0) n'arrive jamais à linker
|
| > Faute à sa non-conformité avec le standard C++.
|
| Faute à savoir s'en servir, peut-être. VC++ 6.0 est bien plus
| conforme que la plupart de ses contemporains, et traite ce
| cas-ci (que la norme n'a pas changé par rapport à l'ARM)
| correctement.

Chapitres et versets ?

| (Évidemment, je fais abstraction que le code en question
| introduit un comportement indéfini dans le programme, et que
| donc, tout ce que peut faire le compilateur est conforme.)
|
| > Si une portabilité sur de tels compilateurs est désirable, une
| > alternative est:
| > enum { NULL=0 };
|
| Aussi illégal (et donc, comportement indéfini).
|
| La norme dit que NULL est un macro. L'utilisateur n'a donc pas
| droit de le rédéfinir.

Uniquement si un entête standard est inclus.


[...]

| En attendant, si tu veux lire le C++, il faut comprendre les
| deux écritures, parce que tu vas les voir.

Woaw. Et en ce qui concerne la sémantique de « const », tu as essayé ?

-- Gaby
1 2 3 4