2011-12-18 6 views
8

Estoy tratando de crear una estructura utilizada en dos archivos fuente .c para hacer una estructura de lista enlazada simple. Pensé que ahorraría tiempo para crear una estructura en el archivo de encabezado; sin embargo, aparece el error "analizar error antes de *".¿Definir estructuras autorreferenciales en un archivo de encabezado C (.h)?

Este es el código que estoy usando:

/* 
* Structures.h 
* 
* Created on: Dec 17, 2011 
*  Author: timgreene 
*/ 

#ifndef STRUCTURES_H_ 
#define STRUCTURES_H_ 

typedef struct list_struct { 
    int data; 
    struct list_struct* next; 
    struct list_struct* prev; 
} list; 

#endif /* STRUCTURES_H_ */ 

Edit: omití originalmente un detalle que es, en realidad estoy compilando con xcc de la cadena de herramientas XMOS. Todavía no entiendo que habría una diferencia en la sintaxis del archivo .h.

¿Podría ser una bandera de compilación que estoy usando?

Aquí está la copia impresa de la consola:

xcc -O0 -g -Wall -c -MMD -MP -MF"filter.d" -MT"filter.d filter.o " -target=XC-1A -o filter.o "../filter.xc" 
In file included from ../filter.xc:15: 
Structures.h:13: error: parse error before '*' token 
Structures.h:14: error: parse error before '*' token 
Structures.h:15: error: parse error before '}' token 
+5

Su código compila bien para mí. (GCC 4.5). – Owen

+13

Tenga en cuenta que los identificadores que comienzan con guiones bajos "_" están reservados y no deben utilizarse. –

+2

Tu código es correcto; el error está en otra parte. –

Respuesta

10

Mirando a su alrededor en la parte de la documentación XMOS, parece que el problema es que XC no es C, es solo un lenguaje tipo C. Desde el "XC Guía de Programación":

XC proporciona muchas de las mismas capacidades que C, la omisión principal es el apoyo para los punteros.

... lo que explica que no acepta las next y prev punteros en su estructura.

Aparentemente, xcc le permite mezclar fuentes C y XC, por lo que si limitara el uso de la estructura al código C, debería funcionar. Desde el "Manual de línea de comandos XCC", parece que cualquier cosa con una extensión .xc (como en la línea de comando que utilizó anteriormente) se trata como XC, en lugar de C, el código fuente de forma predeterminada. Esto puede anularse colocando la opción -xc antes de las fuentes C en la línea de comandos y -x después (o simplemente cambie el nombre de los archivos por una extensión .c).

Si debe utilizar XC en lugar de C, es posible que deba encontrar otra forma de hacer las cosas (¿matrices, quizás?).

+0

¡Oh, guau! Esta es una omisión vergonzosa de mi parte, gracias amablemente Dmitri! Me siento bastante humillado por la última hora más o menos ... –

+0

Además, para cualquier otra persona que tenga problemas con el mismo problema, es simple incluir un código C normal en XC usando un archivo de cabecera, así que externalice sus requisitos de estructura de datos del .xc archivo si es posible, ciertamente no define ningún puntero en ningún archivo de encabezado utilizado por un módulo .xc, o parecerá un tonto. –

1

Trate de usar una declaración adelantada de struct list_struct:

struct list_struct; 
typedef struct list_struct { 
    int data; 
    struct list_struct* next; 
    struct list_struct* prev; 
} list; 

Tal vez su compilador no reconoce el identificador en el medio de su propia definición, I' No estoy seguro de lo que dicen los estándares sobre eso (en todo caso).

Para aquellos que no lo sabe ya, esta es también la manera de tratar con dependencias circulares en struct definiciones:

struct a; 
struct b; 

struct a { 
    int x; 
    struct b *y; 
}; 

struct b { 
    int x; 
    struct a *y; 
}; 
+2

El código OP es perfectamente compatible con los estándares. Si el compilador no lo admite, entonces el compilador debe desecharse. –

+0

-1 su ejemplo de dependencias circulares sería, si fuera código C legal, crear tipos infinitamente grandes. ¿Qué devolvería 'sizeof (struct a)'? –

+0

Sí, pretende ser un puntero. Arreglado. – Kevin

Cuestiones relacionadas