Pourquoi ce code fonctionne-t-il en C mais pas en C ++?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
Pourquoi ce code fonctionne-t-il en C mais pas en C ++?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
Tentative de définition est autorisé en C mais pas en C++.
Une tentative de définition des données externes déclaration qui n'a pas de classe de stockage de prescripteur et le pas de l'initialiseur.
C99 6.9.2/2
Une déclaration d'un identificateur d'un objet qui a de la portée du fichier sans un initialiseur, et sans un stockage de classe rédacteur de devis ou avec la capacité de stockage de classe spécificateur de statique, constitue un tentative de définition. Si une unité de traduction contient un ou plusieurs provisoire des définitions pour une l'identificateur, et l'unité de traduction ne contient pas de définition externe de cet identifiant, puis le comportement est exactement comme si l'unité de traduction contient un fichier portée de la déclaration du identificateur, avec le type composite à compter de la fin de l'unité de traduction, avec un initialiseur égal à 0.
Donc, int i
est une tentative de définition. Le compilateur C sera de combiner toutes les tentatives de définitions dans une seule définition de l' i
.
En C++, votre code est mal formé en raison de la Définition de la Règle (Section 3.2/1 ISO C++)
Aucune unité de traduction doit contenir plus d'une définition de variable, fonction, type de classe, type d'énumération ou de modèle.
// mais si j'écris
int i = 5;
de nouveau-je obtenir de l'erreur en C aussi
Parce que dans ce cas il ne reste plus une tentative de définition en raison de l'initialiseur (5).
Juste pour le plaisir de l'information
J. 5.11 extérieures Multiples définitions
Il peut y avoir plus d'une définition externe de l'identifiant d'un objet, avec ou sans l'utilisation explicite du mot-clé extern; si les définitions sont en désaccord, ou plus que ce qu'on est initialisé, le comportement est indéfini (6.9.2).
Consultez également cet excellent post sur les variables externes.
Tha est appelé tentative de définition. C'est uniquement autorisé en C.
Une tentative de définition est externe déclaration de données qui n'a pas de stockage classe le prescripteur et le pas de l'initialiseur.Un tentative de définition devient un définition si la fin de la l'unité de traduction est atteint et il n' la définition est apparue avec une initialiseur de l'identificateur. Dans cette situation, le compilateur réserve non initialisée espace pour l'objet défini.
Les instructions suivantes montrent normale définitions et de tentative de définitions.
int i1 = 10; /* definition, external linkage */
static int i2 = 20; /* definition, internal linkage */
extern int i3 = 30; /* definition, external linkage */
int i4; /* tentative definition, external linkage */
static int i5; /* tentative definition, internal linkage */
int i1; /* valid tentative definition */
int i2; /* not legal, linkage disagreement with previous */
int i3; /* valid tentative definition */
int i4; /* valid tentative definition */
int i5; /* not legal, linkage disagreement with previous */
C++ ne prend pas en charge le concept d'une tentative de définition: une externe déclaration de données sans une classe de stockage spécifique est toujours une définition.
À partir d'ici: une définition Indicative
Pour mieux comprendre la définition provisoire, parcourez cette
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.