2011-12-18 8 views
8

मैं एक साधारण लिंक्ड सूची संरचना बनाने के लिए दो .c स्रोत फ़ाइलों में उपयोग की जाने वाली संरचना बनाने की कोशिश कर रहा हूं। मैंने सोचा कि यह हेडर फ़ाइल में एक स्ट्रक्चर बनाने के लिए समय बचाएगा, हालांकि, मुझे 'पहले त्रुटि * त्रुटि' मिलती है।सी हेडर फ़ाइल (.h) में स्वयं-रेफरेंसियल structs को परिभाषित करना?

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

संपादित करें::

इस कोड मैं का उपयोग कर रहा है मैं मूल रूप से एक विस्तार है कि है, मैं वास्तव में XMOS toolchain से XCC साथ संकलन कर रहा हूँ छोड़ किया था। मुझे अभी भी समझ में नहीं आता है कि .h फ़ाइल सिंटैक्स में कोई अंतर आएगा।

क्या यह एक संकलन ध्वज हो सकता है जिसका मैं उपयोग कर रहा हूं?

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

शायद आपके संकलक का अपना परिभाषा के बीच में पहचानकर्ता को नहीं पहचानता है, मैं:

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

आपका कोड मेरे लिए ठीक संकलित करता है। (जीसीसी 4.5)। – Owen

+13

ध्यान दें कि अंडरस्कोर "_" से शुरू होने वाले पहचानकर्ता आरक्षित हैं, और इनका उपयोग नहीं किया जाना चाहिए। –

+2

आपका कोड सही है; त्रुटि कहीं और है। –

उत्तर

10

XMOS प्रलेखन में से कुछ में चारों ओर देख रहे हैं, ऐसा लगता है समस्या यह है कि है एक्ससी सी नहीं है, यह सिर्फ एक सी जैसी भाषा है। "XC प्रोग्रामिंग गाइड" से:

XC सी, मुख्य चूक संकेत के लिए समर्थन होने के रूप में एक ही क्षमताओं के कई प्रदान करता है।

... जो बताता है कि क्यों वह अपने ढांचे में next और prev संकेत स्वीकार नहीं करता।

स्पष्ट रूप से xcc आपको सी और एक्ससी स्रोतों को मिश्रण करने देता है, हालांकि, यदि आप संरचना के उपयोग को सी कोड में सीमित करना चाहते हैं तो इसे काम करना चाहिए। "एक्ससीसी कमांड-लाइन मैनुअल" से, ऐसा लगता है कि .xc एक्सटेंशन (जैसा कि आपने ऊपर उपयोग की गई कमांड लाइन में) के साथ कुछ भी डिफ़ॉल्ट रूप से सी, स्रोत कोड के बजाय एक्ससी के रूप में माना जाता है। कमांड लाइन पर सी स्रोतों और -x के बाद विकल्प -xc विकल्प (या .c एक्सटेंशन के साथ फ़ाइलों का नाम बदलें) विकल्प से पहले इसे ओवरराइड किया जा सकता है।

यदि आप सी के बजाय एक्ससी का उपयोग करना चाहते हैं, तो आपको चीजों को करने का एक और तरीका खोजने की आवश्यकता हो सकती है (सरणी, शायद?)।

+0

ओह वाह! यह मेरे हिस्से पर एक शर्मनाक चूक है, धन्यवाद दिमित्री! मुझे पिछले घंटे या उससे बहुत अपमानित लगता है ... –

+0

इसके अलावा, किसी भी अन्य समस्या के साथ संघर्ष करने के लिए, एक हेडर फ़ाइल का उपयोग कर एक्ससी में सामान्य सी कोड शामिल करना आसान है, इसलिए .xc से आपकी डेटा संरचना आवश्यकताओं को आउटसोर्स करना यदि संभव हो तो फ़ाइल, निश्चित रूप से किसी .xc मॉड्यूल द्वारा उपयोग की जाने वाली किसी भी शीर्षलेख फ़ाइल में किसी भी पॉइंटर्स को परिभाषित न करें, या आप मूर्ख की तरह दिखेंगे। –

1

struct list_struct के आगे घोषणा उपयोग करके देखें:

यहाँ सांत्वना प्रिंटआउट है मुझे यकीन नहीं है कि मानकों के बारे में क्या कहते हैं (यदि कुछ भी हो)।

उन है कि पहले से ही नहीं है पता है के लिए, यह भी struct परिभाषाओं में परिपत्र निर्भरता से निपटने के लिए तरीका है:

struct a; 
struct b; 

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

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

ओपी का कोड पूरी तरह से मानकों-अनुरूप है। यदि संकलक इसका समर्थन नहीं करता है, तो संकलक को फेंकने की जरूरत है। –

+0

-1 परिपत्र निर्भरताओं का आपका उदाहरण होगा, यदि यह कानूनी सी कोड था, तो असीमित रूप से बड़े प्रकार का निर्माण करें। 'आकार (संरचना ए) 'वापसी क्या होगा? –

+0

हाँ, एक सूचक होने के लिए मतलब था। ठीक कर दिया। – Kevin

संबंधित मुद्दे