2011-12-18 36 views
8

Tôi đang cố gắng tạo cấu trúc được sử dụng trong hai tệp nguồn .c để tạo cấu trúc danh sách được liên kết đơn giản. Tôi nghĩ rằng nó sẽ tiết kiệm thời gian để tạo ra một cấu trúc trong tập tin tiêu đề, tuy nhiên, tôi nhận được một lỗi 'phân tích cú pháp trước khi *'.Xác định cấu trúc tự tham chiếu trong tệp tiêu đề C (.h)?

Đây là mã Tôi đang sử dụng:

/* 
* 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_ */ 

Chỉnh sửa: Tôi ban đầu bỏ qua một chi tiết có nghĩa là, tôi thực sự biên soạn với xcc từ toolchain XMOS. Tôi vẫn không hiểu rằng sẽ có sự khác biệt trong cú pháp tệp .h.

Nó có thể là cờ tổng hợp mà tôi đang sử dụng không?

Dưới đây là giao diện điều khiển in:

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

Mã của bạn biên dịch tốt cho tôi. (GCC 4.5). – Owen

+13

Lưu ý rằng số nhận dạng bắt đầu bằng dấu gạch dưới "_" được đặt trước và không được sử dụng. –

+2

Mã của bạn là chính xác; lỗi nằm ở nơi khác. –

Trả lời

10

Nhìn xung quanh trong một số tài liệu XMOS, có vẻ như vấn đề là XC không phải là C, nó chỉ là một ngôn ngữ giống như C. Từ "Hướng dẫn lập trình XC":

XC cung cấp nhiều khả năng giống như C, thiếu sót chính đang hỗ trợ cho con trỏ.

... giải thích lý do tại sao nó không chấp nhận các con trỏ nextprev trong cấu trúc của bạn.

Rõ ràng xcc cho phép bạn kết hợp các nguồn C và XC, do đó, nếu bạn giới hạn việc sử dụng cấu trúc của bạn thành mã C thì nó sẽ hoạt động. Từ "Hướng dẫn sử dụng dòng lệnh XCC", có vẻ như bất kỳ thứ gì có đuôi mở rộng .xc (như trong dòng lệnh bạn đã sử dụng ở trên) được coi là XC, thay vì C, mã nguồn theo mặc định. Điều này có thể bị ghi đè bằng cách đặt tùy chọn -xc trước các nguồn C trên dòng lệnh và -x sau đó (hoặc chỉ đổi tên các tệp có phần mở rộng là .c).

Nếu bạn phải sử dụng XC thay vì C, bạn có thể cần phải tìm cách khác để làm việc (mảng, có thể?).

+0

Oh wow! Đây là một sự thiếu sót đáng xấu hổ về phía tôi, cảm ơn Dmitri! Tôi cũng cảm thấy khá nhục nhã trong khoảng một giờ qua ... –

+0

Ngoài ra, đối với bất kỳ ai khác đang gặp khó khăn với cùng một vấn đề, việc thêm mã C bình thường vào XC bằng cách sử dụng tệp tiêu đề là rất đơn giản, vì vậy hãy thuê ngoài các yêu cầu cấu trúc dữ liệu của bạn .xc nếu có thể, chắc chắn không định nghĩa bất kỳ con trỏ nào trong bất kỳ tệp tiêu đề nào được sử dụng bởi mô-đun .xc, hoặc bạn sẽ trông giống như một kẻ ngốc. –

1

Hãy thử sử dụng một tờ khai chuyển tiếp của struct list_struct:

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

Có lẽ trình biên dịch của bạn không nhận ra định danh ở giữa định nghĩa của riêng mình, tôi m không chắc chắn những tiêu chuẩn nói về điều đó (nếu có).

Đối với những người không làm đã biết, đây cũng là cách để đối phó với phụ thuộc vòng tròn trong struct định nghĩa:

struct a; 
struct b; 

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

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

Mã OP hoàn toàn tuân thủ các tiêu chuẩn. Nếu trình biên dịch không hỗ trợ nó, thì trình biên dịch cần được loại bỏ. –

+0

-1 ví dụ về phụ thuộc vòng tròn của bạn, nếu đó là mã C hợp pháp, hãy tạo các loại vô hạn lớn. 'Sizeof (struct a)' return sẽ là gì? –

+0

Vâng, có nghĩa là trở thành một con trỏ. Sửa lỗi. – Kevin

Các vấn đề liên quan