web-dev-qa-db-fra.com

Obsolescence du mot-clé statique ... pas plus?

En C++, il est possible d'utiliser le mot clé static dans une unité de traduction pour affecter la visibilité d'un symbole (déclaration de variable ou de fonction).

Dans n3092, cela était déconseillé:

Annexe D.2 [depr.static]
L'utilisation du mot-clé statique est déconseillée lors de la déclaration d'objets dans la portée de l'espace de noms (voir 3.3.6).

Dans n3225, cela a été supprimé.

Le seul article que j'ai pu trouver est quelque peu informel.

Il souligne cependant que pour la compatibilité avec C (et la possibilité de compiler des programmes C en C++), la dépréciation est ennuyeuse. Cependant, compiler un programme C directement en C++ peut déjà être une expérience frustrante, donc je ne sais pas si cela mérite d'être pris en considération.

Est-ce que quelqu'un sait pourquoi cela a été changé?

83
Matthieu M.

Dans C++ Standard Core Language Defect Reports and Accepted Issues, Revision 94 under 1012. Undeprecating statique `ils notent:

Bien que 7.3.1.1 [namespace.unnamed] indique que l'utilisation du mot-clé statique pour déclarer des variables dans la portée de l'espace de noms est déconseillée parce que l'espace de noms sans nom fournit une alternative supérieure, il est peu probable que la fonctionnalité soit supprimée à tout moment dans un avenir prévisible. .

En gros, dire que la dépréciation de static n'a pas vraiment de sens. Il ne sera jamais supprimé de C++, et il est toujours utile car vous n'avez pas besoin du code passe-partout dont vous avez besoin avec des espaces de noms sans nom, si vous voulez simplement déclarer une fonction ou un objet avec une liaison interne.

71

Je vais essayer de répondre à votre question, bien que ce soit une vieille question, et elle ne semble pas très importante (ce n'est vraiment pas très important en soi ) , et il a déjà reçu de très bonnes réponses. La raison pour laquelle je veux y répondre est qu'elle se rapporte à des problèmes fondamentaux d'évolution standard et de conception de langage lorsque le langage est basé sur un langage existant: quand les fonctionnalités du langage devraient-elles être dépréciées, supprimées ou modifiées de manière incompatible?

En C++, il est possible d'utiliser le mot clé statique au sein d'une unité de traduction pour affecter la visibilité d'un symbole (déclaration de variable ou de fonction).

Le lien en fait.

Dans n3092, cela était déconseillé:

La dépréciation indique:

  • Le intention pour supprimer certaines fonctionnalités à l'avenir; cela ne signifie pas que les fonctionnalités obsolètes seront supprimées dans la prochaine révision standard, ou qu'elles doivent être supprimées "bientôt", ou pas du tout. Et les fonctionnalités non obsolètes peuvent être supprimées dans la prochaine révision standard.
  • Une tentative formelle de décourager son utilisation.

Ce dernier point est important. Bien qu'il n'y ait jamais de promesse formelle que votre programme ne sera pas rompu, parfois silencieusement, par la prochaine norme, le comité devrait essayer d'éviter de casser le code "raisonnable". La dépréciation devrait indiquer aux programmeurs qu'il est déraisonnable de dépendre de certaines fonctionnalités .

Il souligne cependant que pour la compatibilité avec C (et la possibilité de compiler des programmes C en C++), la dépréciation est ennuyeuse. Cependant, compiler un programme C directement en C++ peut déjà être une expérience frustrante, donc je ne sais pas si cela mérite d'être pris en considération.

Il est très important de conserver un sous-ensemble commun C/C++, en particulier pour les fichiers d'en-tête. Bien entendu, les déclarations globales static sont des déclarations de symboles avec lien interne et ce n'est pas très utile dans un fichier d'en-tête.

Mais le problème n'est jamais seulement la compatibilité avec C, c'est la compatibilité avec C++ existant: il y a des tonnes de programmes C++ valides existants qui utilisent static déclarations globales. Ce code n'est pas seulement formellement légal, il est solide, car il utilise une fonctionnalité de langage bien définie de la manière dont il est destiné à être utilisé .

Le simple fait qu'il existe désormais une "meilleure façon" (selon certains) de faire quelque chose ne rend pas les programmes écrits à l'ancienne "mauvais" ou "déraisonnables". La capacité d'utiliser le mot clé static sur les déclarations d'objets et de fonctions à portée globale est bien comprise dans les communautés C et C++, et le plus souvent utilisée correctement.

Dans la même veine, je ne vais pas changer les transtypages de style C en double en static_cast<double> simplement parce que "les transtypages de style C sont mauvais", comme static_cast<double> n'ajoute aucune information et aucune sécurité.

L'idée que chaque fois qu'une nouvelle façon de faire quelque chose est inventée, tous les programmeurs se précipiteraient pour réécrire leur code de travail bien défini existant est tout simplement folle. Si vous voulez supprimer toutes les laideurs et problèmes C hérités, vous ne changez pas C++, vous inventez un nouveau langage de programmation. Supprimer à moitié une utilisation de static rend à peine C++ moins C-moche.

Les modifications de code ont besoin d'une justification, et "l'ancien est mauvais" n'est jamais une justification pour les modifications de code.

Rompre les changements de langue nécessite une justification très forte. Rendre le langage très légèrement plus simple ne justifie jamais un changement de rupture.

Les raisons expliquant pourquoi static est mauvais sont juste remarquablement faibles, et il n'est même pas clair pourquoi les déclarations d'objets et de fonctions ne sont pas obsolètes ensemble - leur donner un traitement différent ne rend guère le C++ plus simple ou plus orthogonal.

Donc, vraiment, c'est une triste histoire. Pas à cause des conséquences pratiques qu'elle a eues: elle n'a eu exactement aucune conséquence pratique. Mais parce que cela montre clairement un manque de bon sens de la part du comité ISO.

28
curiousguy

Obsolète ou non, la suppression de cette fonctionnalité de langue briserait les codes existants et ennuierait les gens.

Toute la question de la dépréciation statique était juste un vœu pieux du type "les espaces de noms anonymes sont meilleurs que statiques" et "les références sont de meilleurs pointeurs". Lol.

12
Maxim Egorushkin