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++ Discussion :

Andrzej's C++ blog : pas compris l'utilisation de sizeof() pour une assertion


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Andrzej's C++ blog : pas compris l'utilisation de sizeof() pour une assertion
    Hello,

    Je lis le tout premier article d' Andrzej, qui traite des assertions.

    À un moment, il définit une macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define ASSERT(_COND) \
      static_cast<void>( sizeof((_COND) ? true : false) )
    Mais je ne suis pas sûr d'en comprendre le but.
    Il évoque le cas d'assertions trop coûteuses à évaluer, mais pour lesquelles on voudrait toutefois vérifier la syntaxe.
    J'ai du mal à réellement voir une utilité à cela, mais soit.

    Mais quel est l'intérêt du sizeof ?
    Andrzej précise : sizeof has exactly the properties we need.
    Mais quelles sont les propriétés en question ?

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    La propriété dont il parle est la suivante :
    When applied to an expression, sizeof does not evaluate the expression
    Source : http://en.cppreference.com/w/cpp/language/sizeof

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
     
    #define ASSERT1(_COND) \
      static_cast<void>( sizeof((_COND) ? true : false) )
     
    #define ASSERT2(_COND) \
      static_cast<void>( (_COND) ? true : false )
     
    int main()
    {
        ASSERT1(std::cout << "foo"); // n'écrit rien
        ASSERT2(std::cout << "bar"); // écrit "bar"
        return 0;
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Donc, le but est de vérifier que _COND est une expression valide, qui serait capable de se convertir en booléen, sans pour autant évaluer l'opérateur ternaire, au cas où _COND aurait d'éventuels effets de bords (du genre ++i>j) ?
    Le static_cast étant là pour éviter d'éventuels warnings du genre "variable non utilisée" ?

  4. #4
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Andrzej a écrit :
    The main purpose of assertion is simply to be there, in the code, and for the programmer to be able to see what is asserted. What it does at run-time is of secondary importance, and assertions may as well do nothing at run-time (debugging or release mode) and they would still be useful.
    [...]
    Also, there are assertions that cannot be checked even in debugging mode. For example, binary search requires that the range be sorted. Verifying if the range is sorted has linear complexity whereas searching itself is logarithmic. If our function is called often and our condition is checked time and again even for medium-sized data, the assertion may be an overkill.
    Donc ce serait pour faire du code dans ce genre-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define UNCHECKED_ASSERT(_COND) \
      static_cast<void>( sizeof((_COND) ? true : false) ) // _COND n'est pas évalué, mais doit être convertible en bool.
     
    BinaryTree::add(const Element& element)
    {
        UNCHECKED_ASSERT(isSorted());
     
        // code
     
        UNCHECKED_ASSERT(isSorted());
    }
    En fait, c'est pareil que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BinaryTree::add(const Element& element)
    {
        // isSorted() est vrai.
     
        // code
     
        // isSorted() est vrai.
    }
    sauf que le compilateur vérifie que isSorted() compile et est convertible en booléen.

    Citation Envoyé par oodini Voir le message
    Le static_cast étant là pour éviter d'éventuels warnings du genre "variable non utilisée" ?
    C'est pour éviter un avertissement du style "valeur non utilisée".

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    OK, merci à toi !

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

Discussions similaires

  1. [regex] j'ai pas compris l'utilisation du point
    Par argoet dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 07/06/2011, 15h43
  2. Réponses: 1
    Dernier message: 07/05/2008, 18h38
  3. Utiliser un ascenseur pour une application MDI
    Par kurkaine dans le forum C++Builder
    Réponses: 6
    Dernier message: 27/09/2006, 13h54
  4. Réponses: 4
    Dernier message: 09/02/2006, 17h44
  5. [MASM] Utiliser un .IF pour une comparaison de nombre signés
    Par Crisanar dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 24/11/2004, 16h32

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