2009-04-29 50 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的内置偏移量

相关问题