2009-04-29 51 views
12

我在有類似這樣的語句幾行現有的C代碼的工作:爲什麼Eclipse CDT的說:「語法錯誤」,但編譯沒有問題

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

的結構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; 
}; 

我使用Eclipse CDT,它用橙色波浪線標記爲'語法錯誤'。我認爲它是由CDT索引器標記的。 但是,編譯(手動在終端中)是沒有問題的。

這是一個有點不方便,但是由於線路上的元素不獲取索引(所以調用層次結構樹並不總是正確的,或元素的高亮顯示等)

爲什麼的Ecipse不喜歡這條線嗎?

回答

25

Eclipse CDT包含自己的預處理器/解析器,用於分析代碼並構建索引。但是,當您調用構建CDT時,會向您的系統編譯器調用,例如gcc。 CDT解析器接受的語法與編譯器接受的語法之間可能存在細微差異。發生這種情況時,CDT解析器可能會感到困惑。

在我的系統上,offsetof宏展開爲使用__offsetof__關鍵字的表達式。這個關鍵字不被CDT識別,所以這就是語法錯誤的原因。爲了解決這個問題,CDT解析器已建成的宏來處理__offsetof__,看起來像這樣:

#define __offsetof__(x) (x) 

這似乎並非是正確的,至少在我的系統上的結果是去除__offsetof__關鍵字仍然會導致語法錯誤。

我可以通過轉到路徑和符號屬性頁面並添加映射到'foo'的__offsetof__的宏來擺脫語法錯誤。這會誘使解析器認爲它只是對它以前從未見過的函數的調用,而不是語法錯誤。

或者,您可以通過轉到窗口>首選項>常規>編輯器>文本編輯器>註釋並取消選中C/C++索引器標記的所有複選框來關閉編輯器中的語法錯誤報告。

+1

謝謝邁克。我試圖找出如何關閉語法突出顯示。感謝您指出! – iGbanam 2010-11-03 03:52:21

2

可能會感到困惑,例如,檢查您是否在範圍內定義了offsetof。否則,你可以嘗試簡化表達式,使用例如一個#defineoffset之類的東西。

我在想編譯器可能會提供offsetof的內置版本,而Eclipses的編譯器/代碼分析器可能不會。如果是這樣,你需要確保你有定義,以便Eclipse能夠正確解析你的代碼。

+0

按下偏移量F3(goto聲明),將我帶到stddef.h文件,所以它似乎引用了宏的正確偏移量 – Rabarberski 2009-04-29 13:52:06

+0

並且您是否還#include文件,在有問題的行之前? – unwind 2009-04-29 13:57:47

0

我見過Eclipse做了一些這樣的事情,我用它來做Java。通常關閉和打開文件再次修復它爲我(重置任何錯誤)。它通常似乎是WAS出現的錯誤,但已被修復,並且「錯誤緩存」沒有正確更新。

+0

是的,我知道你的意思。我也必須這樣做。但在這種情況下,這樣做並不能解決問題。 – Rabarberski 2009-04-29 13:52:52

5

看來CDT解析器不喜歡offsetof(struct ...)的部分。 如果使用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 2009-04-29 14:23:23

1

㈣得到了同樣的問題。有2個offsetof定義(一個用於C,另一個用於C++)。 IMO問題來自該

例如,如果i型

#ifndef __cplusplus 
#endif 

Eclipse將灰色它。這意味着__cplusplus被定義,但我的項目是C不幸的是我找不到修復程序。

+0

檢查你創建了ac項目,而不是一個c + +項目。我沒有你提到的問題。 – Oliver 2009-05-27 19:10:08

2

嘗試切換索引爲「完整的C/C++索引(完全分析)」,在首選項 - > C/C++ - >索引

1

我檢查在生成文件項目的標籤錯誤解析器新CDT後固定類似的問題項目嚮導,除去CDT的Visual C錯誤分析器(我用gcc)

6

我固定的問題,在日食CDT與首選項 - > C/C++ - >語言映射:添加 內容類型:C-頭 語言: C++

0

我最終解決了這個問題。首先我打開項目屬性,然後打開C/C++ general-> Paths and Symbols類別。在符號選項卡添加此條目:

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

這些符號索引器使用,但是不能傳遞到編譯器(至少在Makefile的項目,我沒有其他的類C項目的試了一下) ,所以它不會覆蓋GCC的內置偏移量

相關問題