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

9 réponses

1 2 3 4
Avatar
Fabien LE LEZ
On Fri, 04 Feb 2005 00:41:54 +0100, Philippe Mesmeur
:

const int NULL = 0;


J'ai enfin compris pourquoi il ne faut pas aborder ce sujet ici ;-P


--
;-)

Avatar
Olivier Azeau
Gabriel Dos Reis wrote:
writes:

| Gabriel Dos Reis wrote:
|
| [...]
| > C'est justement là le point crucial : si tu te retrouves
| > implémenteur de la bibliothèque standard, tu ne vas pas lire
| > TC++PL3 pour savoir la sémantique du langage :-). En d'autres
| > termes, TC++PL3 s'adresse au programmeur C++ (et non
| > l'implémenteur C++), et il y a virtuellement peu d'occasions
| > où « if you feel you must » se justifie.
|
| Alors, pourquoi est-ce qu'il en parle ?

Tu connais son adresse : bs at research dot att dot com.
Je ne doute pas qu'il est en train de suivre la discussion


Il doit etre le seul...

Avatar
Gabriel Dos Reis
"Olivier Azeau" writes:

| Gabriel Dos Reis wrote:
| > writes:
| >
| > | Gabriel Dos Reis wrote:
| > |
| > | [...]
| > | > C'est justement là le point crucial : si tu te retrouves
| > | > implémenteur de la bibliothèque standard, tu ne vas pas lire
| > | > TC++PL3 pour savoir la sémantique du langage :-). En d'autres
| > | > termes, TC++PL3 s'adresse au programmeur C++ (et non
| > | > l'implémenteur C++), et il y a virtuellement peu d'occasions
| > | > où « if you feel you must » se justifie.
| > |
| > | Alors, pourquoi est-ce qu'il en parle ?
| >
| > Tu connais son adresse : bs at research dot att dot com.
| > Je ne doute pas qu'il est en train de suivre la discussion
|
| Il doit etre le seul...

il y en a x, avec x > 1.0
;-/

-- Gaby
Avatar
Falk Tannhäuser
Fabien LE LEZ wrote:

On Fri, 04 Feb 2005 00:41:54 +0100, Philippe Mesmeur
:

const int NULL = 0;


J'ai enfin compris pourquoi il ne faut pas aborder ce sujet ici ;-P


Ce que je trouve le plus étonnant est que personne n'ait mentionné
le fait que cette définition ne marche pas avec plusieurs versions
récentes de gcc et que les implémenteurs de gcc ne sont même pas
d'accord entre eux si ça doit marcher ou pas - voir la discussion dans
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id867> et aussi
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id644> (pour 'enum {NULL = 0};')

Peut-on en conclure que gcc n'arrive pas à faire beaucoup de choses ?

Falk


Avatar
Gabriel Dos Reis
Falk Tannhäuser writes:

| Fabien LE LEZ wrote:
|
| > On Fri, 04 Feb 2005 00:41:54 +0100, Philippe Mesmeur
| > :
| >
| >>const int NULL = 0;
| > J'ai enfin compris pourquoi il ne faut pas aborder ce sujet ici ;-P
|
| Ce que je trouve le plus étonnant est que personne n'ait mentionné
| le fait que cette définition ne marche pas avec plusieurs versions
| récentes de gcc et que les implémenteurs de gcc ne sont même pas

Pour une définition de récente.

| d'accord entre eux si ça doit marcher ou pas - voir la discussion dans

Comme je l'ai expliqué sur comp.std.c++ à mon interlocuteur favori
(gougle sur le même sujet avec James Kanze et Gabriel Dos Reis),
c'était un bug de GCC et non une décision délibérée basée sur une
interprétation innovative de la norme. Le bug est apparu à un moment donné
lorsque le code qui s'occupe des conversions et des expressions
constantes å été revu (il a été remanié plusieurs fois, si tu regardes
bien le ChangeLog qui va bien).

Je l'ai déja publiquement expliqué à James sur comp.std.c++. Mais je
répète l'explication ici.

En Juillet dernier, pendant une discussion sur fr.comp.lang.c à propos
de NULL et void, toujours avec James, j'ai reçu une note (assez matinale
d'ailleurs) de BS -- qui suivait la discussion -- disant que GCC (à
partir de 3.3.x) aurait ce bug. Je lui ai répondu machinalement
quelque chose du genre « ce n'est pas possible » avant de me rendre
compte que c'était vrai. Je lui avait répondu machinalement parce que
je savais qu'il n'y avait aucun débat là dessus et *aucun développeur
de G++ n'avait pris la décision* de dire que cette définition ne
devait pas marcher. J'ai alors immédiatement fait un rapport de bug --
qui a été fixé quasi-immédiatement.

Plus tard, j'ai appris que le bug avait déjà été rapporté mais que des
gens avaient répondu que ce n'était pas valide. À ma connaissance,
cette justification ne provenait ni de Jason Merrill, ni de Mark
Mitchell ni de moi.

Il est à noter que lorsque j'ai signalé le bug

http://gcc.gnu.org/bugzilla/show_bug.cgi?id489

il a été immédiatement fixé par Mark Mitchell, sans discussion.

En résumé, il y a probablement eu des désaccords dans certains milieux
mais je ne me rappelle d'aucune discussion entre les maintainers et les
développeurs de G++ pour dire que la définition ne doit pas marcher.

J'essaie, pour ma part, de suivre les activités des « bugmasters »
mais c'est difficile de tout suivre et il peut arriver que certaines
choses passent à travers. De là å affirmer que les développeurs ne
sont pas d'accord entre eux pour savoir si cette définition doit
marcher ou pas, il y a un grand pas. Les bugmasters ne sont pas les
développeurs et les maintainers de G++ et de plus il peut leur arriver
de faire des erreurs. Comme à tout le monde. Quand je suis au courant,
j'interviens immédiatement. C'est ce que font Mark Mitchell et Jason
Merrill aussi.

| <http://gcc.gnu.org/bugzilla/show_bug.cgi?id867> et aussi
| <http://gcc.gnu.org/bugzilla/show_bug.cgi?id644> (pour 'enum {NULL = 0};')
|
| Peut-on en conclure que gcc n'arrive pas à faire beaucoup de choses ?

il y a plus d'un qui seraient d'accord.

-- Gaby
Avatar
Fabien LE LEZ
On 08 Feb 2005 15:19:00 +0100, Gabriel Dos Reis
:

| Il doit etre le seul...

il y en a x, avec x > 1.0
;-/


A suivre sérieusement la conversation, en plus de BS, il y a... toi et
James ;-)


--
;-)

Avatar
K. Ahausse
"Gabriel Dos Reis" a écrit dans le message de
news:
"Olivier Azeau" writes:

| Gabriel Dos Reis wrote:
| > writes:
| >
| > | Gabriel Dos Reis wrote:
| > |
| > | [...]
| > | > C'est justement là le point crucial : si tu te retrouves
| > | > implémenteur de la bibliothèque standard, tu ne vas pas lire
| > | > TC++PL3 pour savoir la sémantique du langage :-). En d'autres
| > | > termes, TC++PL3 s'adresse au programmeur C++ (et non
| > | > l'implémenteur C++), et il y a virtuellement peu d'occasions
| > | > où « if you feel you must » se justifie.
| > |
| > | Alors, pourquoi est-ce qu'il en parle ?
| >
| > Tu connais son adresse : bs at research dot att dot com.
| > Je ne doute pas qu'il est en train de suivre la discussion
|
| Il doit etre le seul...

il y en a x, avec x > 1.0


il y en a x, avec x-0.45 > 1.0

Avatar
Alain Naigeon
"Fabien LE LEZ" a écrit dans le message news:

On Fri, 04 Feb 2005 00:41:54 +0100, Philippe Mesmeur
:

const int NULL = 0;


J'ai enfin compris pourquoi il ne faut pas aborder ce sujet ici ;-P


Tiens, pour une fois j'avais compris avant toi ;-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
kanze
Gabriel Dos Reis wrote:
writes:


[...]
| Il faut aller bien en arrière pour trouver un époque où static
| n'avait pas la signification d'un linkage interne en C.

1978-79 suffit.


Et ça n'est pas « bien en arrière » ? C'était avant que j'ai
appris le C, en tout cas ; avant même que j'en avais entendu
parler.

Et c'est vraiement une limite -- mon K&R I est à la maison, pas
ici, alors, je ne peux pas vérifié, mais il me semble que
l'utilisation de static pour donner un linkage interne y était,
et c'est copyright 1978. (Mais je pourrais m'y tromper. Le
manuel de la version 7 d'Unix ne parle pas de la possibilité
d'utiliser static en dehors d'une fonction, et il date d'à peu
près le même époque. Mais alors, qui l'a introduit, quand et
pourquoi ? Mais surtout, pourquoi le même mot clé pour deux
choses fondamentalement différentes ?)

L'inventeur de C with Classes discuter directement avec les
inventeus de C et avait de première main, l'essence de chaque
notion de C -- avant que le comité ANSI C mutile nombre
d'entre elles.


Il faut dire que le langage C était assez en évolution à
l'époque. L'affectation des struct, les énumération, etc. Quant
à l'« essence de chaque notion », l'essence principale, c'est la
manque d'une conception globale ; le langage est une collection
d'ad hoc solutions aux problèmes, au fur et à mésure qu'ils se
sont présentés. (Je me base ici sur les écrits de Richie,
particulièrement
http://cm.bell-labs.com/cm/cs/who/dmr/chist.html.) Note bien que
je ne trouve pas que ad hoc solutions sont forcément mauvaises.
Au moins, elles sont des solutions à des problèmes réels ;
choses qui manquent souvent dans des langages conçus d'un coup.
Mais ça fait que parler des choses comme l'« essence de la
notion » n'a pas nécessairement beaucoup de sens.

Aussi, il a exité une communité des utilisateurs de C en dehors
de AT&T bien avant la normalisation de C. Le comité de
normalisation de C n'a pratiquement rien inventé en ce qui
concerne le langage de base. (Je parle de C90, évidemment. C99 a
introduit quelque nouveautés.)

[...]

| > C++ a maintenu cette signification et étendud cette notion
| > avec celle de « donnée membre statique », il y a deux
| > décennies.

| Il y a deux décennies, "static" signifiait déjà un linkage
| externe aussi.

ce qui ne fait qu'apporter de l'eau à mon moulain : « static »
n'a pas été inventé pour affecter le linkage, mais pour
spécifier « une seule instance dans ce programme », et le nom
pour désigner cette seule instantce peut avoir un linkage
externe, cela ne rentre pas en contradiction.


Mais personne n'a jamais mis ça en question. Ce qu'on met en
question, c'est l'importance d'une telle énoncée. Le fait est
que quand C a ressenti le besoin de pouvoir déclarer des
variables avec ce qu'on appelle maintenant un linkage interne,
il s'est servi du mot clé static pour le faire. Et que cette
évolution a eu lieu avant que la plupart d'entre nous ont vu le
C ; pour nous, il fait partie integrante du C.

| > Mais, certaines personnes ont perverti ce sens en le
| > surchargeant avec la notion de linkage.

| Des noms, des noms. Tu pourrais tranquillement dire que ces
| personnes s'appellent Brian Kernighan et Dennis Richie. (Ça
| ne

Uniquement si c'est le cas. Mais cela ne l'est pas.


Ce n'est pas Kernighan et Richie qui ont introduit l'utilisation
de static pour le linkage. Tu m'étonnes. (Mais vue que ça a eu
lieu avant que je commence à faire du C, je ne sais pas qui l'a
introduit en fait.)

| veut pas dire que je ne suis pas d'accord avec toi en
| pensant que c'est un peu une « perversion », ou au moins que
| ce n'est pas très logique. Mais il n'empèche que la «
| perversion » était présente dès que le C est échappé de
| AT&T, et qu'elle fait partie integrante de C.)

il y avait beaucoup de choses qui étaient présentes dans le C
échappé de Bell Labs, un certain nombre d'entre eux n'étaient
pas vraiment l'invention de Kernighan et Ritchie, qui si j'en
juge par les sources que j'ai ici, font plutôt dans la
cohérence, la clarté et la simplicité.


Individuellement, peut-être. Je ne sais pas qui est responsable
de quoi dans l'ensemble. Mais si C et Unix brillent (ou
brillait, and le cas d'Unix) par leur simplicité, ils n'ont
jamais été des modèles de cohérence ni de clarté.

Ce que je sais de seconde main (puique je l'ai eue de
quelqu'un qui l'a eu de première main), c'est que « static »
n'a pas été inventé par K&R pour affecter le linkage, mais
pour dire « une seule instance dans le programme ».


Tu prends la question à l'inverse. La question, ce n'est pas
« quelle était la première utilisation de static », mais
« qu'est-ce qu'on a fait pour introduire le linkage externe dans
le langage ».

Et c'est aussi, ce qui est à la base de la « deprecation « de
static dans certaines de ses utilisations pour dire spécifier
linkage interne.


C'est un argument. Mais je ne crois pas qu'il a été l'argument
principal (qui, il me semble, tournait autour de
l'orthogonalité).

Mais qu'importe. Je crois qu'on est d'accord sur le présent : il
est préférable d'utiliser des espaces référentiels anonyme que
static d'une part parce que c'est plus orthogonal (ça marche
aussi pour les définitions de classe) et aussi parce que le mot
clé « static » sied assez mal pour cette utilisation, et a
d'autres significations.

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

| C'est bien. Mais quel rapport avec le surcharge du const ?

Le rapport est avec ton commentaire, mais c'est vrai, tu ne
lis pas les messages auquels tu réponds.


Si tu ne veux pas t'expliquer, tu n'as qu'à le dire.

Ce que je ne comprends pas trop, c'est que tu semble t'enrager
contre l'utilisation de static pour spécifier un linkage
interne, mais l'utilisation de const pour la même chose te
semble tout à fait acceptable.

Tiens, en passant, j'ai une vraie question sur la norme. Que dit
la norme sur la suivante :

int const toto = 42 ;
inline int titi() { return toto ; }

En supposant, évidemment, que c'est dans un fichier d'en-tête
qui est inclu dans plusieurs unités de compilation.

Ça ne serait pas une violation de la ODR ?

--
James Kanze GABI Software
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

1 2 3 4