2009-11-12 4 views
11

Je reçois cette erreur:avertissement: « struct user_data_s » déclarée dans la liste des paramètres

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 

qui je pense est parce que j'ai un struct qui contient une struct.

C'est ce que je suis en train 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); 
} 

printf dans les travaux f1, 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?

étreintes, Louise

+3

Afficher le code complet, y compris la déclaration de 'struct user_data_s', câlins plus tard :) –

+0

double possible de [avertissement du compilateur C étrange: avertissement: 'struct' a déclaré dans la liste des paramètres] (http://stackoverflow.com/questions/ 16831605/strange-compilateur-warning-c-warning-struct-declare-inside-parameter-list) –

Répondre

20

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

Cela revient à 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); 
} 

compile 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 compilera pas, parce que f2 n'a aucun moyen de savoir ce qu'est un struct user_data_s est.

Vous pourriez avoir l'habitude de programmer dans un langage de plus haut niveau qui vous permet de placer vos déclarations/définitions à peu près n'importe où (C# ou Python), mais C est compilé strictement de haut en bas.

+0

Merci beaucoup =) Je n'avais pas inclus dans le fichier d'en-tête, où les structures ont été définies. Je n'aurais jamais pensé à ça moi-même. – Louise

+0

Il y a aussi une autre raison commune, mais difficile à trouver, cela peut se produire. Le fichier d'en-tête qui a cette définition de structure, ou l'une de ses dépendances, contient une erreur. Le don est généralement au bas de la liste des avertissements, il peut donc être difficile d'y arriver. –

5

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

Vous n'avez pas déclaré struct user_data_s n'importe où à l'avance. Le compilateur voit 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 portée 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 f1 est complètement indépendante de la deuxième déclaration de struct user_data_s dans la définition f2. Ces déclarations déclarent deux types locaux complètement différents (pour chaque fonction) struct user_data_s. Vous ne pouvez pas appeler f2 depuis f1 comme dans votre exemple car leurs types de paramètres sont complètement indépendants.

Normalement, vous devez avoir préalablement déclaré struct user_data_s à l'étendue du fichier, au lieu de le 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?

+0

Oui =) C'était exactement le problème. J'ai oublié d'inclure le fichier d'en-tête =) Merci beaucoup pour l'explication détaillée. Maintenant, je ne ferai plus jamais cette erreur =) – Louise

Questions connexes