warning: ‘struct user_data_s’ déclarée dans la liste de parameters

Je reçois cette erreur:

transform.c:23: warning: 'struct user_data_s' declared inside parameter list transform.c:23: warning: its scope is only this definition or declaration, which is probably not what you want 

Je pense que c’est parce que j’ai une structure qui contient une structure.

C’est ce que j’essaie de faire:

 void f2(struct user_data_s* data) { printf("Number %i\n", data->L); } void f1(struct user_data_s* data) { printf("Number %i\n", data->L); f2(data); } 

Le printf en f1 fonctionne, mais la ligne

 void f2(struct user_data_s* data) { 

donne l’erreur.

Est-ce que quelqu’un sait comment je peux résoudre ce problème?

Câlins, Louise

Vous avez déclaré votre structure entre (ou éventuellement après) vos déclarations de f2 et f1 . Déplacez votre déclaration de structure afin qu’elle vienne avant les deux déclarations.

C’est-à-dire:

 struct user_data_s { int L; }; void f2(struct user_data_s* data) { printf("Number %i\n", data->L); } void f1(struct user_data_s* data) { printf("Number %i\n", data->L); f2(data); } 

comstack sans erreur, mais

 void f2(struct user_data_s* data) { printf("Number %i\n", data->L); } struct user_data_s { int L; }; void f1(struct user_data_s* data) { printf("Number %i\n", data->L); f2(data); } 

ne comstackra pas car f2 n’a aucun moyen de savoir ce qu’est une struct user_data_s .

Vous êtes peut-être habitué à programmer dans un langage de niveau supérieur vous permettant de placer vos déclarations / définitions à peu près n’importe où (comme C # ou Python), mais malheureusement, le langage C est compilé de manière ssortingcte.

Le compilateur vous a déjà donné une assez bonne explication de ce qui se passe.

Vous n’avez pas déclaré la struct user_data_s . Le compilateur voit la struct user_data_s dans les définitions de fonctions ci-dessus pour la toute première fois. Dans chaque cas, la déclaration de struct user_data_s a une scope de bloc, c’est-à-dire qu’elle est locale à la fonction correspondante. Cela signifie que la première déclaration de struct user_data_s dans la définition de f1 est complètement indépendante de la deuxième déclaration de struct user_data_s dans la définition de f2 . Ces déclarations déclarent deux types locaux complètement différents (à chaque fonction) struct user_data_s . Vous ne pouvez pas appeler f2 partir de f1 comme dans votre exemple car leurs types de parameters sont complètement indépendants.

Normalement, vous devez au struct user_data_s déclarer struct user_data_s au niveau de la scope du fichier, au lieu de la déclarer dans la définition de la fonction. Avez-vous oublié d’inclure un en-tête avec la déclaration de struct user_data_s par hasard?