2009-04-29 12 views
12

मैं मौजूदा सी कोड जो इस एक के लिए इसी तरह के बयान के साथ लाइनों की एक जोड़ी है में काम कर रहा हूँ संकलन:क्यों करता है ग्रहण CDT कहते हैं: 'सिंटेक्स त्रुटि', लेकिन कोई समस्या नहीं

struct collect_conn *tc = (struct collect_conn *) 
    ((char *)c - offsetof(struct collect_conn, runicast_conn)); 

struct collect_conn साथ चला जाता है निम्नलिखित लाइनों:

struct collect_conn { 
    struct runicast_conn runicast_conn; 
    struct announcement announcement; 
    const struct collect_callbacks *cb; 
    struct ctimer t; 
    uint16_t rtmetric; 
    uint8_t forwarding; 
    uint8_t seqno; 
}; 

मैं ग्रहण CDT का उपयोग कर रहा है, और यह एक नारंगी टेढ़ा-मेढ़ा 'सिंटेक्स त्रुटि' के रूप में लाइन के साथ लाइन चिह्नित करता है। मुझे लगता है कि इसे सीडीटी इंडेक्सर द्वारा चिह्नित किया गया है। हालांकि, संकलन (मैन्युअल रूप से टर्मिनल में) कोई समस्या नहीं है।

हालांकि यह थोड़ा असुविधाजनक है, क्योंकि लाइन पर तत्व अनुक्रमित नहीं किए जाते हैं (ताकि कॉल पदानुक्रम पेड़ हमेशा सही नहीं है, या तत्वों की हाइलाइटिंग, आदि)

Ecipse क्यों लाइन की तरह नहीं है?

उत्तर

25

ग्रहण सीडीटी में आपके कोड का विश्लेषण करने और इंडेक्स बनाने के लिए अपना प्रीप्रोसेसर/पार्सर होता है। हालांकि, जब आप अपने सिस्टम कंपाइलर को एक बिल्ड सीडीटी कॉल करते हैं, उदाहरण के लिए जीसीसी की तरह। सीडीटी पार्सर द्वारा स्वीकार किए गए वाक्यविन्यास और आपके कंपाइलर द्वारा स्वीकार किए गए वाक्यविन्यास के बीच मामूली मतभेद हो सकते हैं। जब ऐसा होता है तो सीडीटी पार्सर भ्रमित हो सकता है।

मेरे सिस्टम पर offsetof मैक्रो एक अभिव्यक्ति में फैलता है जो __offsetof__ कीवर्ड का उपयोग करता है। यह कीवर्ड सीडीटी द्वारा पहचाना नहीं गया है इसलिए यही वाक्यविन्यास त्रुटि है।इस समस्या से निपटने के लिए CDT पार्सर __offsetof__ जो इस तरह दिखता है से निपटने के लिए एक मैक्रो में बनाया गया है:

#define __offsetof__(x) (x) 

यह सही होने के लिए, कम से कम अपने सिस्टम पर परिणाम को निकालने की है प्रकट नहीं होता है स्रोत से __offsetof__ कीवर्ड जो अभी भी एक वाक्यविन्यास त्रुटि की ओर जाता है।

मैं पथ और प्रतीकों संपत्ति पृष्ठ पर जाकर और __offsetof__ के लिए मैक्रो जोड़कर वाक्यविन्यास त्रुटि से छुटकारा पाने में सक्षम था जो 'foo' पर नक्शा लगाता है। यह पार्सर को उस फ़ंक्शन को केवल कॉल करने में सोचता है जिसे उसने पहले नहीं देखा है, लेकिन वाक्यविन्यास त्रुटि नहीं है।

वैकल्पिक रूप से आप विंडो> प्राथमिकता> सामान्य> संपादकों> टेक्स्ट संपादकों> एनोटेशन पर जाकर और सी/सी ++ इंडेक्सर मार्करों के लिए सभी चेकबॉक्स को अनचेक करके संपादक में वाक्यविन्यास त्रुटि रिपोर्टिंग बंद कर सकते हैं।

+1

धन्यवाद माइक। मैं यह समझने की कोशिश कर रहा था कि सिंटैक्स हाइलाइटिंग कैसे बंद करें इसे इंगित करने के लिए धन्यवाद! – iGbanam

2

यह भ्रमित हो सकता है, उदाहरण के लिए, यदि आपके पास offsetof इन-स्कोप की परिभाषा है या नहीं। अन्यथा आप अभिव्यक्ति को सरल बनाने का प्रयास कर सकते हैं, उदाहरण के लिए इसे तोड़ना #defineoffset, या कुछ के साथ।

मुझे लगता है कि कंपाइलर offsetof का एक अंतर्निहित संस्करण प्रदान कर सकता है, जबकि एक्लिप्स के कंपाइलर/कोड-पार्सर शायद नहीं। यदि ऐसा है, तो आपको यह सुनिश्चित करना होगा कि आपके पास परिभाषा है, ग्रहण के लिए आपके कोड को सही तरीके से पार्स करने में सक्षम होना चाहिए।

+0

ऑफ़सेट पर F3 (गोटो घोषणा) दबाकर मुझे stddef.h फ़ाइल में ले जाता है, इसलिए ऐसा लगता है कि यह सही ऑफसेट मैक्रो – Rabarberski

+0

है और क्या आप यह भी शामिल करते हैं समस्याग्रस्त लाइन से पहले फ़ाइल? – unwind

0

मैंने ग्रहण को कुछ बार देखा है, और मैं इसे जावा के लिए उपयोग करता हूं। आम तौर पर फाइल को बंद करना और खोलना मेरे लिए इसे ठीक करता है (जो भी गलत है रीसेट करता है)। यह आमतौर पर एक त्रुटि प्रतीत होता है जो वहां था लेकिन तय किया गया है और "त्रुटि कैश" सही ढंग से अपडेट नहीं किया गया है।

+0

हां, मुझे पता है तुम्हारा क्या मतलब है। मुझे कभी-कभी ऐसा करना पड़ता है। लेकिन इस मामले में, यह ऐसा करके हल नहीं किया जाता है। – Rabarberski

5

ऐसा लगता है कि सीडीटी पार्सर को ऑफ़सेट ऑफसेट (स्ट्रक्चर ...) पसंद नहीं है। यदि आप typedef का उपयोग करके collect_conn घोषित करते हैं तो त्रुटि दूर हो जाती है। मेरे लिए कम से कम, निम्नलिखित कोड काम करता है:

typedef struct { 
    struct runicast_conn runicast_conn; 
    struct announcement announcement; 
    const struct collect_callbacks *cb; 
    struct ctimer t; 
    uint16_t rtmetric; 
    uint8_t forwarding; 
    uint8_t seqno; 
} collect_conn; 
... 
struct collect_conn *tc = (struct collect_conn *) 
    ((char *)c - offsetof(collect_conn, runicast_conn)); 

आप मूल घोषणा न बदल सकें तो कुछ इस तरह करते हैं:

typedef struct collect_conn collect_conn_t; 
+0

हां, वास्तव में, यह काम करता है। लेकिन यह मेरे लिए एक विकल्प नहीं है :-( – Rabarberski

1

चतुर्थ एक ही समस्या मिला है। ऑफ़सेट की 2 परिभाषा है (सी के लिए एक और सी ++ के लिए एक)। IMO समस्या उदाहरण के लिए कि

से आते हैं अगर मैं टाइप

#ifndef __cplusplus 
#endif 

ग्रहण यह ग्रे होगा। इसका मतलब है __cplusplus परिभाषित किया गया है, लेकिन मेरी परियोजना एक सी

दुर्भाग्यवश मुझे कोई फिक्स नहीं मिला है।

+0

जांचें कि आपने एसी प्रोजेक्ट बनाया है और सी ++ प्रोजेक्ट नहीं है। मुझे आपके द्वारा उल्लेख की जाने वाली समस्या नहीं है। – Oliver

2

इंडेक्सर परिवर्तित करने का प्रयास करने के लिए "पूर्ण C/C++ इंडेक्सर (पूरा पार्स)" वरीयताएं- में> C/C++ -> इंडेक्सर

1

मैं न्यू CDT में Makefile परियोजना में टैब त्रुटि Parsers की जाँच के बाद इसी तरह की समस्या का समाधान होने परियोजना विज़ार्ड, (जीसीसी मैं उपयोग कर रहा हूँ) को बाहर निकालने CDT विज़ुअल सी त्रुटि पार्सर

+0

कोई भी जानता है कि मौजूदा परियोजना के लिए यह कैसे करें, न कि एक नई परियोजना? –

6

मैं के साथ ग्रहण CDT में समस्या को सुलझा लिया वरीयताएँ-> C/C++ -> भाषा मैपिंग: जोड़े सामग्री प्रकार: सी-हैडर भाषा: सी ++

0

मैंने इस तरह की समस्या को हल करने का अंत किया। सबसे पहले मैंने परियोजना गुणों को खोला, फिर सी/सी ++ सामान्य-> पथ और प्रतीक श्रेणी। प्रतीक टैब के अंतर्गत मैं इस प्रविष्टि कहा:

Symbol: offsetof(TYPE,MEMBER) 
Value: ((ssize_t) &((TYPE *)0)->MEMBER) 

इन प्रतीकों इंडेक्सर द्वारा किया जाता है लेकिन संकलक को पास नहीं (कम से कम Makefile परियोजनाओं में, मैं इसे सी परियोजना के अन्य प्रकार में प्रयास नहीं किया है) , इसलिए यह जीसीसी के अंतर्निर्मित ऑफ़सेट को

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