8
votes

Qu'est-ce que const sous vide FOO (const int a) fait?

Je comprends la signification de const pour les pointeurs ou les structures qui doivent être transmis par référence à une fonction. Toutefois, dans l'exemple: xxx

la variable A est transmis sur la pile. Il n'y a aucun préjudice à l'appelant pour modifier le contenu de la pile, donc const semble assez inutile dans cette situation.

En outre, si je ne peux pas modifier a , je peux toujours effectuer une copie de A et modifier cette copie: xxx

Dans quelle situation le mot-clé const sera-t-il utile lorsqu'il sera appliqué à un argument de fonction scalaire (pas un pointeur)?


1 commentaires

Ce n'est pas parce que quelque chose peut être fait ne signifie pas que cela devrait être fait ou est utile. Dans ce cas, comme les autres l'ont dit, cela pourrait être utile.


5 Réponses :


1
votes

Il est utile principalement à des fins de documenter votre code.

Pour les futurs personnes regardant via votre code source, le const sert à mettre l'accent sur votre intention (qu'aucun du code dans FOO () devrait tenter de modifier un ).


9 commentaires

Pourquoi «les gens» (l'appelant) se souciait-il de la manière dont votre fonction est mise en œuvre en interne? Ce n'est rien de leurs affaires et ils ne pouvaient pas se moquer de moins.


"Personnes" pourrait également être un mantiénier du code.


Il ne peut servir que de documenter la mise en œuvre . Il est ignoré dans la déclaration de fonction.


@tatvurri, donc au cas où le responsable du code n'a aucune idée de son propre code, il est là de les sauver d'eux-mêmes? La programmation ne fonctionne pas de cette façon: au point où vous ne savez plus ce que fait votre propre code, il n'y a aucun espoir de sauvegarder le programme.


@Lundin Il n'est pas nécessaire d'être votre propre code. Cela peut être le code d'un programmeur qui a quitté la société il y a 10 ans sans laisser de document de conception derrière. Comme la réponse indique, que const peut servir à mettre l'accent sur votre intention pour les lecteurs ultérieurs.


@thanri ou alternativement, il peut confondre le diable des lecteurs futurs. Ici, maintenez cela, je vous ai aidé avec un code auto-documentant pour le rendre plus lisible et explicite: extern const signé Int Func (const signé Int x) {auto const signé int y = x + (const signé INT) 5; retour (const signé int) y; }


@Lundin ok, sérieusement? Il y a une différence énorme entre les futurs responsables à venir s'attendre à ce que le paramètre passé pas change de la mise en œuvre et que "porc sauvage" avec implicite < / i> syntaxe. N'oubliez pas que tout compilateur raisonnable devrait vous crier si vous (dans la mise en œuvre) tenter de modifier le paramètre.


@Christianhenry Notez que cela ne se produira que si le const est dans la mise en œuvre. Cela n'a aucun sens pour le mettre dans la déclaration de fonction car elle est jetée. Cela signifierait donc "la mise en œuvre de la fonction ne peut pas modifier le paramètre iff il le déclare aussi comme const ", ce qui n'est pas aussi utile. Peut-être que vous vouliez impliquer cela, mais ce n'est pas clair dans votre réponse.


@Christianhenry Je ne vois vraiment pas la différence. Je ne veux pas faire la fonction de fonction de la fonction par erreur, alors j'utilise extern. Je ne veux pas modifier la valeur retournée par erreur, alors je le fais const. Je ne veux pas utiliser des entiers non signés par erreur, alors je les fais signé. Etc. Mais bien sûr, si vous savez réellement ce que vous faites, alors rien n'est nécessaire.



3
votes

Il est inutile d'utiliser Const pour un paramètre de valeur, mais il a sa valeur si ce que vous voulez est de garantir le code de ce que vous avez l'intention.

ici Il y a une réponse avec un exemple de cas d'utilisation


0 commentaires

2
votes

Cela signifie qu'un implémenteur de la fonction ne peut pas modifier la valeur du paramètre d'entrée A que la fonction reçoit par la valeur.

Cela peut conduire à une stabilité accrue du programme.

(personnellement, je n'aime pas le style comme je le trouve trop verbeux).

Si vous DO adoptez ce style, notez bien que vous n'avez besoin que de mettre le const dans la liste des paramètres de la fonction définition , vous ne le avez pas besoin dans la déclaration .


12 commentaires

La valeur est transmise sur la pile. Par définition, la mise en œuvre ne peut pas modifier la valeur de A .


Dans un sens oui, mais la valeur du A ne peut pas être modifiée par la fonction.


"Cela peut conduire à une stabilité accrue du programme" Comment?


J'ai vu des codes coquins comme a / = 100 au moins plusieurs fois. Le jeune quant dit "mais j'en ai besoin comme un pourcentage". "Non tu ne" pas "dit I. Et d'appliquer cela, voici un const dans le prototype. Veuillez prendre les paramètres d'optimisation à la valeur faciale. »Ainsi, au moins une banque d'investissement que insiste sur le style const .


@Bathsheba Le même problème existe avec des personnes qui abusent des nombres de points flottants car ils "ont besoin de décimaux". Il n'y a pas plusieurs solutions, aucune d'entre elles impliquant le mot-clé const : éduquer les gens, faire des critiques de code ou n'engagez pas les débutants pour écrire un logiciel de haute intégrité pour commencer.


@NOWOX L'implémenteur ne peut pas modifier la valeur du local dans la mise en œuvre. Juste comme dire const int n = 3;


Il peut être utile de mentionner qu'il n'est pas pertinent que la déclaration de fonction ait un const dedans ou non. Ce qui compte est la définition.


@juanchopanza: C'est un bon point. Je l'ai ajouté. Mon commentaire précédent sur le " const dans le prototype" est imprécis.


Fwiw, je recommande généralement pas pour mettre le const dans la déclaration, car cela peut être trompeur: la définition peut omettre le const , et Pourquoi l'appelant devrait-il se soucier si la mise en œuvre ne modifie pas de toute façon une de ses variables locales?


Mais là encore, MISRA, par exemple, nécessite d'avoir les mêmes qualificateurs de types sur la déclaration et la définition. Si vous souhaitez que le const et que vous souhaitez vous conformer à MISRA, vous devez le mettre dans les deux: s


@turri a malra vraiment mal au niveau supérieur const s (qui sont ignorés) correspondent? Ce serait décevant.


Je cite: «Les types des paramètres et les valeurs de retour dans le prototype et la définition doivent correspondre. Cela nécessite des types identiques, y compris des noms TypeDEF et des qualificatifs, et pas seulement des types de base identiques». Je suppose que le const est inclus dans la partie de qualificatif.



2
votes

C'est la même chose que déclarant toute variable constante xxx

C'est une bonne pratique de programmation pour déclarer des variables comme const si vous connaissez que leurs valeurs ne changeront pas. De cette façon de la déclaration, vous pouvez éviter que quelqu'un change accidentellement leur valeur plus avant la fonction.


0 commentaires

4
votes

code comme void foo (const int a) n'est pas vraiment significatif, il n'est pas "Conscationness" comme tel.

Les programmeurs parfois trop pédants obtiennent l'idée étrange qu'ils doivent déclarer des paramètres communs comme const simplement parce qu'une fonction ne modifie pas le paramètre réel. Mais le plus souvent, les fonctions ne le font pas.

Le point est que la variable est une copie de l'original, de sorte que votre fonction fait avec cela n'a pas la moindre!

Ce n'est donc pas un moyen d'écrire un code auto-documentant, car tout ce qu'il fait est de dire à l'appelant ce qui se passe à l'intérieur de votre fonction. L'appelant s'en fiche et ne devrait pas s'en soucier.


3 commentaires

J'utilise personnellement le qualificatif const pour les paramètres de fonction - essentiellement chaque fois que je n'ai pas besoin de modifier le paramètre dans le corps de la fonction. Il a utilisé pour aider certains compilateurs C à générer un meilleur code, mais ce n'est pas la raison pour laquelle je le fais. Je le fais parce que cela aide quand les humains lisent le code. Au lieu de lire attentivement une fonction pour voir si la valeur est modifiée, le const nous permet de supposer en toute sécurité qu'il reste comme valeur spécifiée par l'appelant. C'est pourquoi je l'ai intégré dans mon style de codage. Si c'est trop pédant , bien, alors soyez-le.


@Nominalanimal Cela n'aide pas les humains à lire le code s'il est dans le prototype de fonction. Il n'a absolument aucun sens là-bas.


@Nominalanimal, je doute beaucoup, il ait jamais aidé n'importe quel compilateur à générer un meilleur code (contrairement à restreindre etc.). De plus, si vous devez lire lentement et soigneusement lu via une fonction pour savoir si une variable est modifiée, il est probable que la fonction doit être divisée dans plusieurs.