IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

NULL et BCB6


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut NULL et BCB6
    Bonjour,

    Dans le livre de Bjarne Stroustrup, créateur du C++, ce dernier recommande de ne plus utiliser NULL, ou, si le besoin s'en fait sentir, d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const int NULL = 0
    comme déclaration (pas les #define NULL 0 qui ne permettent pas de vérification de type).

    Savez-vous comment NULL est défini si je crée mon projet en faisant Nouveau>Application, c'est à dire dans un projet standard BCB ?

    Cordialement,

    Arnaud

  2. #2
    Membre éprouvé
    Avatar de bebeours
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 103
    Par défaut
    Bonjour,

    En faisant un clic-droit sur NULL et Chercher déclaration, BCB me renvoie sur le fichier _null.h contenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef NULL
    #  if defined(__cplusplus) || defined(_Windows)
    #    define NULL 0
    #  else
    #    define NULL ((void *)0)
    #  endif
    #endif

  3. #3
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    La deuxième déclaration correspond à la macro classique du C.

    Cependant, est-ce que le define NULL 0 est réellement équivalent à ce const int NULL = 0...

    Comment cela fonctionne-t-il à la compilation ?
    Le compilateur remplace toutes les macros par leur valeur, puis compile ?
    Si c'est le cas un define NULL 0 aurait la même signification que l'utilisation de 0 directement dans le code, ce qui est conseillé par Bjarne Stroustrup.
    Mais dans ce cas, pourquoi conseiller le const int NULL = 0 plutôt qu'un define ?

    Cordialement,

    Arnaud

  4. #4
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    pour : define NULL 0
    Le compilateur remplace toutes les macros par leur valeur, puis compile ?
    C'est exactement cela.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  5. #5
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Bonjour,

    Dans ce cas, pourquoi est-il conseillé de définir const int NULL = 0, alors que 0 est casté dans le type voulu par défaut, et que donc le define me semble être équivalent...

    De plus, le conseil de base n'est même pas de faire ce const int NULL = 0, mais de remplacer toutes les références à NULL par 0. Ce que me semble faire parfaitement le define NULL 0...

    Gnn

    Désolé d'insister, mais je tiens à bien mettre ça au clair

    Arnaud

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je ne sais pas s'il y a une règle bien précise au niveau de la construction des
    compilateurs... tant qu'il respectent l'idée que l'on se fait du langage.
    A mon avis, les macros sont soit précalculées ou bien réinjectées dans une ligne...
    selon leur degré de complexité, mais on est sans doute loin des instructions MACRO/EOM
    pour définir des macros sur plusieurs dizaines de lignes.
    Ici il n'y a pas grand chose à précalculer du fait que l'opération sera une
    simple mise à zéro(*) selon qu'il s'agit d'un adressage absolu ou indirect sans
    aller plus loin (registre, indexé, relatif pc, etc...).

    define/const
    Une équivalence peut toujours être redéfinie, ce qui ne génère lors de la compilation
    qu'un simple avertissement mais qui, ici, a une grande importance car la relecture du
    code devient très difficile.
    Par contre une constante ne peut être redéclarée ce qui suggère probablement plus de
    sécurité.

    (*) Remarque :

    L'idée même du NULL valant 0 est d'ailleurs un non-sens parce que ce n'est vrai que
    par rapport à un système d'exploitation donné, sur un type de machine donné et ne
    devrait donc pas être manipulable ou définissable par le développeur mais imposé par
    le compilateur.
    Même si l'idée peut paraître farfelue, un pointeur NULL sur du 65C02 et dérivés, ne
    serait pas à considérer comme "vide" ou "invalide" puisque la "zero page mémory" est
    précisément localisée en 0x0000, là où il est très judicieux de construire les pointeurs,
    compte tenu que ces processeurs étaient dédiés au traitement des données par indirections !
    Et dans ce cas précis un pointeur invalide serait 0xFFFF.
    Mais bon... ça ne risque plus d'arriver !

    A plus !

  7. #7
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Bonjour,

    Tiens, ton message me pose un nouveau problème.

    Le même Bjarne Stroustrup écrit explicitement dans son bouquin :
    "C++ ne créera jamais d'objets à l'adresse 0." (cité de mémoire )

    Intéressant non ?

    Arnaud

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Un pointeur ne pointe pas forcément sur un objet.
    Sauf bien sûr si un pointeur est lui-même un objet.
    L'exemple que je donne avec le 65C02 est le pire des exemples car
    qui peut se vanter aujourd'hui de faire du C++ sur un APPLE 2C ?

    NULL signifie invalide au sens où il n'y a aucune ambiguité possible.
    Sur un PC, qu'est-ce qu'on trouve à l'adresse 0x0 ?
    Sur un APPLE 2C... ça aurait pu poser un problème !

    A plus !

  9. #9
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Ok merci beaucoup à tous de vos précisions !

    Arnaud

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Par défaut
    Citation Envoyé par Bjarne Stroustrup
    In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0.
    Puis comme il préfère éviter les macros, il suggère - à ceux qui tiennent à utiliser NULL - d'utiliser une constante.

    Le zéro ne signifie pas que tous les bits du pointeur seront à zéro, mais il s'agit plutôt d'une convention qui signifie "pointeur invalide". Sur certaines implémentations la représentation du pointeur pourrait être différente de zéro.

  11. #11
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Bonjour,

    C'est vrai que j'ai le bouquin en français, il se peut qu'il y ait eu perte de sens à la traduction...

    Cordialement,

    Arnaud

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  2. Tester si un champ est NULL
    Par titititi007 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2003, 10h17
  3. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  4. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07
  5. PB d'import avec les ActiveX sous BCB6
    Par dergen dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/11/2002, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo