const struct déclaration
Quelqu'un peut me dire la différence entre ces deux versions d'une déclaration d'une structure?
struct S
{
uint8_t a;
};
et
const struct S
{
uint8_t a;
}
Suivie par:
void main(void)
{
struct S s = {1};
s.a++;
}
Astuce, j'ai essayé les deux versions pour S dans Visual Studio C++ 2010 Express donc je sais que les deux compiler avec des erreurs.
Est le "const struct" ne rien faire du tout? "const struct S S = {1};" certainement, mais ce n'est pas la question pour le moment.
Ce qui concerne
Riche
/********************************************/
J'ai juste travaillé ce
const struct <typename> <{type}> <variable instances a, b, .., z>;
est en train de faire:
Quand const est présent avant la "struct", toutes les variables d'instances sont const, comme si elles avaient être défini avec:
const struct <typename> a, b, z;
Afin de ne faire quelque chose, mais pas quand il n'y a pas d'instance de définitions en ligne avec la structure de la déclaration.
Riche
main
appartient. Aucun de ces types est ce qu'il devrait être,int
. Je ne me souviens pas si oui ou non vous êtes autorisé à définir un type dans une définition de fonction (et de toute façon ce n'est pas tout à fait clair dans quelle langue vous êtes à la compilation de ce code), qui pourrait être une erreur supplémentaire.Autre que void main(), ce que d'autres problèmes sont là @KerrekSB
Désolé pour le C++, j'ai supprimé mon commentaire. @Riche: il Vous manque un point-virgule dans le deuxième extrait, et
void main(void)
n'est pas autorisé.Est-il possible que vous pourriez nous montrer le code que vous travaillez avec. Le manque semi-colon me fait penser il y a peut être d'autres questions.
L'absence d'un point-virgule est cus j'ai tapé dans la main libre. Ce n'est pas la question ici. @SteveJessop son PHP (sarc)
OriginalL'auteur RichColours | 2011-10-04
Vous devez vous connecter pour publier un commentaire.
Avec:
La
const
qualificatif, il est un non-sens, et peut même provoquer une erreur de compilation avec certains compilateurs C.gcc
émet un avertissement.Le but semble être de déclarer le type de données
struct S
. Dans ce cas, la syntaxe correcte est:OriginalL'auteur Daniel Trebbien
Une déclaration d'ouvrage définit le type de données.
const
qualificatif entrées grasses pour une variable non un type de données. Ainsi, l'ajout de const précédant une struct déclaration doit être licencié à la la plupart.OriginalL'auteur Alok Save
n'est pas valide construire.
Ce
pourrait éventuellement être valide parce que vous êtes à la déclaration d'une variable
x
qui est maintenantconst
ce qui signifie qu'il ne peut pas changer.En fait, j'ai juste essayé const struct S { u_int8_t a; }; dans le CR et il est compilé sans donner aucune variable d'instance de noms. Alors peut-être nous avons tous besoin de consulter nos recueils de chansons avant de poster "X, c'est mal" dans un post.
OriginalL'auteur Tony The Lion
La
const
qualificatif s'applique à des variables ou des membres.Pour instancier un
const
variable, il suffit de spécifierconst
lors de l'instanciation.Ce
const
n', est:const
variable est créée avec une valeur qui peut être résolu lors de la compilation, mettre la variable dans la mémoire programmeQuand
const
est appliqué aux membres, comme dans:Vous ne pouvez (légalement) à affecter la valeur
i
lors de la création de la structure.Vous pouvez être en mesure de modifier une
const
valeur (si la mémoire du programme se trouve dans la RAM et pas de ROM) par moulage d'un non-const type (const-cast), mais c'est quelque chose que vous ne devriez pas le faire.L'utilisation typique de const-cast est lorsque vous utilisez une bibliothèque qui ne précise pas la constness dans les déclarations de fonction, et de votre code. À ce stade, si vous souhaitez l'utiliser, vous devez faire confiance et jeté les paramètres avant d'appeler ses fonctions.
OriginalL'auteur cJ Zougloub
Lorsque vous déclarez
puis il allouer de la mémoire de l'espace, mais
c'était juste une déclaration compilateur ne pas allouer de l'espace pour cela.
de sorte qu'il affiche l'erreur et en const struct vous n'avez pas à déclarer tout varible voir le code de sorte qu'il affiche l'erreur.
OriginalL'auteur Gouse Shaik
Il est absurde d'utiliser
const
mot-clé avant destruct
.Si vous utilisez
gcc
compilateur, il vous montre le message d'avertissement suivant:OriginalL'auteur Varun Chhangani
C'est la seule utilisation que je peux penser:
Il déclare une structure et crée immédiatement une instance pour qu'il nommé
s
et à ce stade,a
etb
danss
sont initialisées à 0 (veuillez noter que, à ce point de s est une variable globale dans l'unité de traduction qui a été déclaré, et peut être lié à).Si vous essayez de définir les membres de
s
, vous allez échouer:Donc,
s
n'est pas vraiment utile ici...sauf si vous faites quelque chose comme:Maintenant, nous allons créer une autre instance de la même structure (déclaration est encore la même que ci-dessus):
Le compilateur ne vais pas me plaindre plus que
other
n'est pas const! seulements
est const!Maintenant, ce que
const
faire, vous pouvez demander? essayons de changer s:C'est tout pour elle. Si vous n'avez pas besoin de le compilateur d'allouer du stockage pour
s
au moment de la déclaration, et avait toujours besoin d'une instance des
être const vous voudrais juste ajouterconst
au moment de l'instanciation destruct S
(notez la majuscule S!!)Bonus 1
noter qu'il n'y a pas de petites
s
plus. À ce stade, la GCC mettra avertir vous queconst
qualificatif de ne rien faire!!!!!!Bonus 2
Si vous voulez que chaque instance de la structure pour être const, c'est que ses membres ne peut être initialisé au point de définition, vous pouvez faire comme (utilisation de typedef):
Conclusion
Pour moi, c'est juste sucre syntaxique et ajoute inutilement à la complexité du code. Mais qui suis-je pour juger...
OriginalL'auteur Saeid Yazdani