Définition et déclaration de variable avec une valeur

Je viens juste de commencer avec K & R et au 2ème chapitre, il y a la ligne:

Les déclarations répertorient les variables à utiliser et indiquent leur type et éventuellement leurs valeurs initiales .

Alors:

int x = 42 est une définition .

et int x est une déclaration mais aussi une définition puisque chaque définition est une déclaration .

Mais lorsque nous atsortingbuons une valeur initiale telle que K & R , cela ne fait-il pas de la déclaration une définition ?

Vous confondez deux choses:

  1. Une déclaration indique ( déclare ) quels sont le type, le nom et la scope d’un object
  2. Une définition définit le contenu d’un object

* object comme dans: variable, fonction, etc., pas un object OOP.

Une définition est donc très souvent aussi une déclaration, car vous ne pouvez pas définir le contenu d’un object sans indiquer le type de cet object. Le plus simple à retenir est simplement: “Chaque définition est une déclaration, mais toutes les déclarations ne sont pas une définition”

Pour les variables

Il n’y a qu’un seul moyen de déclarer sans définir la variable:

 extern typeX variable_name 

Cela indique au compilateur qu’il existe une variable appelée nom_variable de type typeX, mais pas où l’obtenir. Toute autre façon de déclarer une variable est également une définition, car elle indique au compilateur de lui réserver de l’espace et éventuellement de lui donner une valeur initiale.

La différence est beaucoup plus claire dans les structures et les fonctions:

Pour les structures

Une déclaration:

 struct some_struct{ int a; int b; } 

Cela déclare some_struct au compilateur avec a et b en tant que variables de structure, tous deux de type int.

Ce n’est que lorsque vous les définissez que de l’espace est réservé et que vous pouvez les utiliser:

 void foo(){ struct some_struct s; sa = 1; // For this to work s needs to be defined } 

Pour les fonctions :

La différence est beaucoup plus nette

déclaration:

 // This tells the comstackr that there is a function called "foo" that returns void and takes void arguments void foo(); 

Une définition pourrait être comme celle ci-dessus (dans la partie struct)

En gros, vous pouvez dire qu’une déclaration indique simplement au compilateur qu’il existe quelque part une variable portant ce nom et ce type. Il ne produit aucun code, et en C, cela doit être fait avec le mot-clé extern sur les variables. Les prototypes de fonctions (sans implémentation) sont également de simples déclarations et n’ont pas besoin du mot-clé extern , mais vous pouvez toujours le fournir. Une définition produit un code, par exemple alloue de la mémoire sur la stack ou le tas pour une variable, ou le corps pour les méthodes.

En ce sens, vos deux déclarations sont des définitions, et toute définition est également une explication.

Je pense que cela pourrait être une erreur de K & R …