Je veux savoir sur Constomnals en C et C ++. Comment compilateur impose la constante? Quelqu'un peut-il m'aider s'il vous plaît? P>
6 Réponses :
en général Il n'y a aucune garantie que le compilateur organisera une sorte de protection d'exécution. P> const code> est compilateur 100%. Lorsque vous déclarez quelque chose constant, le compilateur em> place des restrictions sur ce qu'il vous laissera écrire. Il ne vous laissera pas affecter à Const Scalar, attribuer à travers une référence ou un pointeur de const, ou appelez une fonction de non-const de l'objet Const. P>
Excellente réponse. Pour toute personne intéressée par la lecture ultérieure, je suggère la section de la Const de Conscité C ++ FQA: Yosefk.com/ C ++ fqa / const.html
@Eli Comment la Terre a-t-elle voté une liaison FQA ... mieux lire la FAQ sur Const-Correctnes: PARASHIFT.COM/C ++ - FAQ-LITE / Const-correctionness.html . Moins de rants, plus de substance
@Johannes: En fait, je suis en désaccord avec les conclusions sous-jacentes de la FQA sur C ++ et j'utilise joyeusement C ++ dans mon travail de jour, mais je pense que la FQA peut être perspicace et de penser, et de lire cela m'a aidé à comprendre certains des problèmes que je courais dans le codage C ++ beaucoup mieux que la FAQ. De plus, la FQA relie directement à la FAQ dans chaque question, il est donc facile de voir les réponses originales. J'aurais probablement dû ajouter une responsabilité de non-responsabilité que la FQA n'est probablement pas une bonne ressource pour les programmeurs novices, qui devraient certainement rester avec la FAQ.
Lorsque le compilateur compilait le code, il calcule le type de chaque expression afin de pouvoir les vérifier correctement et émettre le code (tel que l'avertissement lorsque vous essayez de stocker un int dans un pointeur ou de convertir correctement un entier. un double). const code> peut être considéré comme faisant partie du type. Comme il a les informations de type pour l'expression, il peut vérifier le type de lvalue em> (côté gauche de l'affectation) et lancer une erreur si elle a "const" dans son type. p>
in c, le mot-clé Constrice rendra une variable immuable, ce qui signifie qu'il ne peut pas être modifié. p>
Habituellement, il s'agit d'une distinction de compilation et n'a aucun effet sur la modification de la variable d'exécution d'une variable. Par exemple, une variable Const peut être modifiée indirectement à l'aide d'un pointeur sur la même adresse mémoire. P>
en C ++, le mot clé Const prend plus d'une signification. P>
Par exemple, une fonction de membre de la classe peut être "Const", ce qui signifie qu'il n'est pas autorisé à modifier l'état d'une instance de classe. P>
Comme dans C, une variable déclarée constante peut également être modifiée indirectement à l'aide d'un pointeur, mais également en utilisant le mot-clé "mutable" ou l'opérateur const_cast <>. P>
(1) strong> Il peut déclarer la Constitution d'un objet em> p> dans l'objet de cas ci-dessus Il est important de noter que ce type de constance est pas amovible em> dans un sens que toute tentative de Modifiez l'objet ci-dessus en moulant à l'écart de la consensité conduit à un comportement non défini (à l'exclusion possible des éléments Prendre ci-dessus en compte, la déclaration suivante p> Comprend deux types différents de ps En tant que note latérale [éventuellement sans rapport], il convient probablement de noter que le terme constant em> a des significations radicalement différentes dans C et C ++. En C ++ constantes em> sont des objets déclarés sous forme const code> Const key in C et C ++ a deux significations sémantiques différentes. t code> est un objet non modifiable. Le compilateur fera de son mieux pour vous empêcher de la modifier en observant les règles Const-Constance em> (qui ne sont pas identiques en C et C ++). Les règles de la Constitution sont appliquées uniquement conceptuellement, au niveau linguistique, ce qui signifie qu'il existe des moyens de contourner ces règles et qui signifie également que la constance d'un objet ne sera pas nécessairement mise en œuvre au niveau physique. C'est à dire. rien ne garantit que l'objet sera finalement placé dans la mémoire en lecture seule. P> mutables de code> en C ++). p> p code> est déclaré comme un pointeur-to-const. Cela ne signifie pas nécessairement que l'objet p code> est pointant vers un objet constant (tel que défini par le premier type de const code> ci-dessus). Il pourrait facilement être une personne non constante, auquel cas il est parfaitement légal em> de jeter la Constance de la voie d'accès ci-dessus et de modifier l'objet, bien qu'il ne s'agisse généralement pas d'une bonne pratique de programmation. En d'autres termes, la Constitution d'un chemin d'accès est potentiellement amovible em>. P> const code>: le dernier const code> déclare la constitution de l'objet p code> (premier type), tandis que le reste de < Code> Const code> Déclarez la Constitution de différents niveaux de chemin d'accès représenté par P code> (deuxième type). P> const code>. Dans C Constantes EM> sont des littéraux. Objets déclarés comme const code> ne sont pas constantes em> en terminologie C. p> p>
Je me souviens à peine quelques informations que j'ai lues il y a longtemps qu'il existe une différence entre C et C ++ en cas de types intégrés intégrés, comme en C ++, (contrairement à C) const peut définir une constante de la compilation et pas nécessairement une variable. Je ne me souviens pas assez d'ajouter une réponse autonome parfaitement correcte, mais si je suis juste peut-être que cette information pourrait être ajoutée ici :)
@Maciej H: Ouais, j'ai répondu à ce
Tout en essayant de comprendre des déclarations telles que const int * const * const * const p = 0; code> Cette "règle" est utile - Fondamentalement 'const' s'applique à tout ce qui est à gauche immédiat (autre que s'il n'y a rien dans ce cas, il s'applique à tout ce qui est son droit immédiat)
@Lazer donc, essentiellement, cela aurait pu être écrit int const * const * const * const p p = 0; code>
En plus de l'immutabilité appliquée par la compilée fournie en utilisant le mot clé Notez que je dépose le const code> que d'autres réponses à votre question ont déjà mentionnées, l'utiliser permet parfois au compilateur de placer de telles données dans les Lecture seule em> section d'un binaire et de mémoire. Selon la section 2.4.2 "Forever const code>" dans l'article Comment Pour rédiger des bibliothèques partagées le faire potentiellement permettant à (1) utiliser moins de ressources et (2) commencer plus rapidement. P>
const code> de données dans de telles zones de mémoire en lecture seule dans le comportement non défini, comme d'habitude. P>
C'est en fait une chose très compliquée dans un compilateur d'optimisation. Cela commence à partir simple, cependant.
Lorsque vous déclarez une variable avec le mot-clé Const (ignorons simplement les pointeurs car ils peuvent être constitués ou pointer vers la const ou les deux), le compilateur se souvient qu'aucun code ne devrait changer cette variable (presque). . Si le compilateur voit le code qui modifie une variable de const, il considère qu'une erreur (ou parfois seulement digne d'un avertissement, mais pour la simplicité, je l'ignorerai). Le compilateur suppose également qu'aucun code qu'il ne peut pas voir (de toute façon de toute façon {code dans d'autres fichiers .c ou éventuellement des fichiers de bibliothèque ou .s ou .asas) changera la variable Const (sauf si elle est L'hypothèse qu'une variable ne changera pas dans certaines ou toutes les circonstances permet aux routines d'optimisation du compilateur de faire des choses qu'elle Sinon, ne pourriez pas faire. Cela signifie des choses comme placer la valeur littérale d'une variable dans le flux d'instructions plutôt que de charger l'adresse de la variable, puis de charger la valeur de la variable. Il peut également supposer que si elle chargeait que si: p> un fichier exécutable (ou autre fichier d'objet) peut avoir une section (.rodata) qui n'a que des constantes. Dans de nombreux cas, le système d'exploitation peut imposer à ne pas permettre à un programme d'écrire dans ces données (ou peut-être même en ROM dans certains cas). Cette section peut également contenir des versions de variables non-consons utilisées pour l'initialisation, car elle peut avoir une constante de constante, non seulement des constantes déclarées comme constantes. P> donc dans C cons représente principalement le compilateur de vous dire que vous avez bousillé et essayez de changer quelque chose qui n'aurait pas dû être changé. Il est permis de faire certaines hypothèses en fonction de cela, cependant. P> en C ++, il devient plus compliqué. Je ne me souviens pas de tous les détails, mais je me souviens que vous pouvez surcharger un nom de fonction basé sur si une valeur que vous passez est constituée ou non, ce qui peut être utile. P> p> const volatile code > auquel cas il supposera qu'il pourrait changer à tout moment, mais il sera toujours imposé à ne pas laisser votre code le modifier - ceci est utile pour la mémoire mappée de mémoire SFR [registres de la fonction spéciale] utilisée pour lire l'état d'un périphérique, mais peut ne sera écrit à. N'oubliez pas que C et C ++ sont utilisés pour la programmation OS et intégrée). P>
Êtes-vous particulièrement intéressé par C ou C ++, car il peut y avoir une différence. Par exemple, le marquage d'une méthode Const en C ++ n'a pas de construction équivalente dans C.
Quelqu'un peut-il m'aider à quel point Compiler crée Const. Je veux juste connaître les internes et non comment consct travaille en C ou C ++
(vous obtenez même des points pour le faire)