2009-11-12 7 views
11

consigo este error:advertencia: ‘struct user_data_s’ declara dentro de la lista de parámetros

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 

que creo que es porque tengo una estructura que contiene una estructura.

Esto es lo que estoy tratando de hacer:

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); 
} 

El printf en las obras de F1, pero la línea

void f2(struct user_data_s* data) { 

da el error.

¿Alguien sabe cómo puedo solucionar esto?

abrazos, Louise

+3

Mostrar el código completo, incluida la declaración de 'struct user_data_s', abrazos después :) –

+0

Posible duplicado de [Advertencia de compilador extraño C: advertencia: 'struct' declarado dentro de la lista de parámetros] (http://stackoverflow.com/questions/ 16831605/strange-compiler-warning-c-warning-struct-declared-inside-parameter-list) –

Respuesta

20

Se han declarado su estructura en el medio (o posiblemente después) sus declaraciones de f2 y f1. Mueva su declaración de estructura para que venga antes de ambas declaraciones.

Es decir:

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); 
} 

compila sin errores, pero

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); 
} 

no se compilará, porque f2 no tiene manera de saber lo que un struct user_data_s es.

Puede que esté acostumbrado a programar en un lenguaje de nivel superior que le permita colocar sus declaraciones/definiciones prácticamente en cualquier lugar (como C# o Python), pero desafortunadamente, C se compila estrictamente de arriba a abajo.

+0

Muchas gracias =) No había incluido en el archivo de encabezado, donde se definió la estructura. Nunca lo hubiera pensado así. – Louise

+0

También hay otra razón común, aunque difícil de encontrar, por la que esto puede ocurrir. El archivo de encabezado que tiene esa definición de estructura, o una de sus dependencias, tiene un error. El obsequio generalmente se encuentra en la parte inferior de la lista de advertencias, por lo que puede ser difícil de multar. –

5

El compilador ya le dio una buena explicación de lo que está sucediendo.

No ha declarado struct user_data_s en cualquier lugar con antelación. El compilador ve struct user_data_s en las definiciones de funciones anteriores por primera vez. En cada caso, la declaración de struct user_data_s tiene alcance de bloque, es decir, es local para la función correspondiente. Esto significa que la primera declaración de struct user_data_s en la definición f1 no tiene relación con la segunda declaración de struct user_data_s en la definición f2. Estas declaraciones declaran dos tipos locales completamente diferentes (para cada función) struct user_data_s. No puede llamar al f2 desde f1 como en su ejemplo ya que sus tipos de parámetros no están relacionados.

Normalmente, debe tener struct user_data_s declarado en el alcance del archivo de antemano, en lugar de declararlo en la definición de la función. ¿Olvidaste incluir un encabezado con la declaración de struct user_data_s por casualidad?

+0

Sí =) Ese fue exactamente el problema. Se olvidó de incluir el archivo de encabezado =) Muchas gracias por la explicación en profundidad. Ahora nunca volveré a cometer ese error =) – Louise

Cuestiones relacionadas