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 .
- Pourquoi une structure est autorisée à avoir un "pointeur sur son propre type" en tant que membre mais pas "un type de structure (un tableau du type)" lui-même?
- Erreur de redéclaration
- Quelle est cette syntaxe de définition de fonction étrange en C?
- la taille d'un tableau peut-elle être déterminée au moment de l'exécution en c?
- Déclaration ou définition en C
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:
* 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 …