Est-il const en C?
Cette question peut être naïve, mais:
- est-il
const
mot-clé dans le C? - depuis quelle version?
- y a-sémantique et/ou syntaxique différences entre
const
en C et C++?
- Voir Aussi: Pourquoi la plupart des développeurs C utilisation de définir la place de const?
- Ce genre de phrases m'ont amené à poser la question 🙂
- stackoverflow.com/questions/162480/const-in-c
- Probable dupe : stackoverflow.com/questions/2308194/...
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas de différences syntaxiques entre le C et le C++ à l'égard de
const
mot-clé, en plus d'une obscure: en C (depuis C99) vous pouvez déclarer les paramètres de la fonction en tant quequi est équivalent à
déclaration. C++ ne prend pas en charge une telle syntaxe.
Sémantique, il existe des différences aussi bien. Comme @Ben Voigt a déjà noté, dans C
const
déclarations ne produisent pas des expressions constantes, c'est à dire en C, vous ne pouvez pas utiliser unconst int
objet dans uncase
étiquette, un peu de largeur de champ ou de la taille du tableau dans un non-VLA déclaration de tableau (tout cela est possible en C++). Aussi,const
objets ont une liaison externe par défaut dans C (liaison interne en C++).Il y a au moins une différence sémantique, qui Ben n'en fait pas mention. Const-correctness règles du langage C++ en charge les éléments suivants de conversion standard
Ces initialisations sont illégales dans de C.
Généralement, lorsque vous traitez avec des multi-niveau des pointeurs, C++, dit que vous pouvez ajouter const-qualification à n'importe quelle profondeur d'indirection, aussi longtemps que vous aussi ajouter const-qualification tous le chemin vers le haut niveau.
En C, vous pouvez seulement ajouter de la const-qualification pour le type pointé par le haut niveau de pointeur, mais pas plus loin.
Une autre manifestation de la même sous-jacent principe général est la manière la const-correctness les règles de travail avec des tableaux en C et C++. En C++, vous pouvez faire
Essayer de faire la même chose en C entraînera une erreur de
Les deux premières questions sont répondues ici: Const en C
Oui, il y a assez peu de différences sémantiques entre
const
en C et C++.En C++,
const
variables de type sont partie intégrante des expressions constantes (si leur initialiseurs de la compilation des expressions constantes) et peut être utilisé dans un contexte qui exige que, comme les limites du tableau, et dans l'enum de définitions. En C, ils ne sont pas et ne peut pas être.En C++,
const
variables globales automatiquementstatic
de liaison, de sorte que vous pouvez les mettre dans des fichiers d'en-tête. En C, ces variables ont une liaison externe et susceptible de générer des doublons erreurs de définition au moment de la liaison.Oui, il y a un
const
mot-clé. Il a été ajouté comme partie à la norme de 1989.Autant que la compatibilité, voici un paragraphe de Harbison & Steele, 5e édition:
Oui,
const
a été là depuis au moins depuis le C ANSI (aka C89).Il semble bien dans ma copie de "Le Langage de Programmation C (2e Édition)", Kernighan & Ritchie (publié en 1988).
Extrait pertinent:
Deux autres différences:
const arraytype
(j'.etypedef int A[1]; const A a = { 0 };
) indique une constante de type tableau ( http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#112 et http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1059 ) (et dont les éléments sont donc qualifiés de trop) en C++, mais un non-constante de type tableau dont les éléments sont donc qualifiés dans C.const const
est valable en C99 (non valable en C89), non valable en C++ dans n'importe quelle version (vous ne pouvez sémantiquement répéter uneconst
, pas du point de vue syntaxique). C'contrats àconst
en C99.La sematic dans C est différent de celui en C++, e.g
dans le fichier portée serait valide en C++ mais pas en C.
Oui.
const
est là, dans C, de C89.Ici est une bonne lecture est d'environ le comportement de mot-clé const en C.
Oui, il y a un
const
mot-clé dans C. Il est là depuis C90.Point de vue syntaxique, il peut se produire dans les mêmes lieux, les mêmes qu'en C++. Sémantiquement, c'est un peu plus laxiste, IIRC.
Selon ESR,
const
a été ajouté dans le C ANSI-Projet de Norme. Eric Giguere résumé de l'ANSI C, daté de 1987, elle confirme.EDIT: Cela ressemble à du projet lui-même -- de la recherche pour "3.5.3 Type qualificatifs".
Il y a un mot clé "const en C, et a été pendant une LONGUE période de temps. Si une variable est désignée "const", écrit-il, sont interdites. En outre, dans certains environnements, les variables déclarées "const" peut être situé dans un autre segment de données à partir d'autres variables. Ce segment de données peut offrir du matériel de protection en écriture, et pour les systèmes embarqués, peuvent être stockés dans la mémoire ROM ou mémoire flash plutôt que dans la mémoire vive (une distinction très importante sur certains processeurs qui ont beaucoup plus de ROM ou flash de RAM--par exemple, 128K flash et 3,5 K de RAM, ou 2K ROM et 96 octets de RAM).
Noter que le compilateur va généralement pas l'inférer à propos de "const" des valeurs ou des expressions impliquant. Si je dis "const char toto[] = "Bonjour";" et puis, plus tard, de faire référence à des foo[1], le compilateur se charge de la valeur (ce qui sera probablement un "e"), d'où foo[] est stocké et utiliser le chargé de la valeur. Parfois, ce utilement permet de valeurs devant être corrigés dans un code compilé de l'image, mais parfois, il vient de déchets code.
Si vous souhaitez définir un certain nombre à être au moment de la compilation "substituables" constant, le meilleur moyen, au moins pour les constantes entières, peut-être d'utiliser "enum". Par exemple, "enum {woozle=19;}" va provoquer 19 pour être remplacé par "woozle" dans le code. Notez qu'à la différence textuelle substitutions; enum déclarations obéir à des règles correctes de portée.