Dans quels cas devons-nous inclure ?

Dans quels cas devrions-nous inclure le cassert ?

En bref, ne l’utilisez pas; utilisez .

C ++ 11 a supprimé toute garantie formelle d’un en-tête “c ….” ne polluant pas l’espace de noms global.

Ce n’était jamais une garantie en pratique, et maintenant ce n’est même pas une garantie formelle.

Par conséquent, avec C ++ 11, il n’ya plus d’avantage concevable à utiliser les variantes d’entête “c ….”, alors que le code qui fonctionne bien avec un compilateur et la version de ce comp Échec de la compilation avec un autre compilateur ou une autre version, en raison, par exemple, de collisions de noms ou d’une sélection de surcharge différente dans l’espace de noms global.

SO, alors que cassert était assez dénué de sens en C ++ 03 (vous ne pouvez pas mettre une macro dans un espace de nommage), il est totalement dénué de sens – même en tant que cas particulier d’un schéma général – en C ++ 11.


Addendum , 22 décembre 2013:

La norme définit chaque en- tête d’en-tête C ++ C en termes de l’en-tête , qui à son tour est défini en termes d’en-tête de bibliothèque C correspondant.

C ++ 11 §D.5 / 2 :

«Chaque en-tête C, chacun ayant un nom de la forme name.h , se comporte comme si chaque nom placé dans l’espace de noms de la bibliothèque standard par l’en-tête cname correspondant était placé dans la scope de l’espace de noms global.

C ++ 11 §D.5 / 3 (exemple non normatif):

“L’en-tête fournit assurément ses déclarations et définitions dans l’espace de noms std . Il peut également fournir ces noms dans l’espace de noms global. L’en-tête fournit assurément les mêmes déclarations et définitions dans l’espace de noms global, comme dans le standard C. Il peut également fournir ces noms dans l’espace de noms std .

Le commentaire de l’utilisateur de Stack Overflow m’a fait savoir que certaines versions de g ++, telles que MinGW g ++ 4.7.2, sont assez non standard en ce qui concerne les en-têtes .

Je savais déjà que MinGW g ++ 4.7.2 était également dépourvu de fonctions telles que swprintf , et que la bibliothèque C ++ pure, telle que C ++ 11 std::to_ssortingng . Cependant, les informations à ce sujet sans les surcharges de la fonction C étaient nouvelles pour moi.

En pratique, le manque de surcharge avec g ++ signifie

  • en ignorant le problème de g ++, ou

  • éviter d’utiliser les surcharges g ++ manquantes,
    par exemple en utilisant uniquement le double sin( double ) , ou

  • en utilisant les surcharges d’espace de noms std
    (il faut alors inclure pour garantir leur présence avec g ++).

Pour utiliser l’espace de noms g ++ std sans surcharge, une approche pratique consiste à définir des wrappers d’en-tête pour ce compilateur. J’ai utilisé cette approche pour résoudre les problèmes de g ++. à la famille printf . Car, comme David Wheeler l’a déjà fait remarquer, «tous les problèmes en informatique peuvent être résolus par un autre niveau d’indirection»…

Ensuite, les choses peuvent être arrangées pour que le code standard qui utilise les surcharges manquantes de g ++ soit également compilé avec g ++. Cela ajuste le compilateur à la norme, avec une quantité de code fixe.

Tout comme n’importe quel autre fichier d’en-tête, vous #include lorsque vous utilisez quelque chose déclaré dans ce fichier d’en-tête, tel que assert() .

Voir une référence facilement accessible

 #include  // uncomment to disable assert() // #define NDEBUG #include  int main() { assert(2+2==4); std::cout << "Execution continues past the first assert\n"; assert(2+2==5); std::cout << "Execution continues past the second assert\n"; } 

assert.h définit une fonction de macro qui peut être utilisée comme outil de débogage standard.