我在现有的C代码中工作,有两行类似的语句:
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;
};
我使用的是EclipseCDT,它用一条橙色的曲线将这条线标记为“语法错误”。我认为cdt索引器就是这样标记的。
但是,编译(在终端中手动)没有问题。
但是,这有点不方便,因为行上的元素没有被索引(因此调用层次结构树并不总是正确的,或者元素的突出显示等等)。
为什么Ecipse不喜欢这条线呢?
最佳答案
eclipse cdt包含自己的预处理器/解析器,用于分析代码和构建索引。但是,当您调用系统编译器的构建cdt调用时,例如gcc。cdt解析器接受的语法和编译器接受的语法之间可能存在细微的差异。当这种情况发生时,cdt解析器可能会感到困惑。
在我的系统中,offsetof
宏扩展为使用__offsetof__
关键字的表达式。CDT无法识别此关键字,因此出现语法错误。为了解决这个问题,cdt解析器内置了一个宏来处理__offsetof__
,如下所示:
#define __offsetof__(x) (x)
这似乎不正确,至少在我的系统上,结果是从源代码中删除了
__offsetof__
关键字,这仍然会导致语法错误。我可以通过转到paths and symbols属性页并为映射到“foo”的
__offsetof__
添加宏来消除语法错误。这会诱使解析器认为它只是对一个以前从未见过的函数的调用,而不是语法错误。或者,您可以通过进入Window >首选项>一般>编辑器>文本编辑器>注释,取消对C/C++索引器标记的所有复选框来关闭编辑器中的语法错误报告。
关于c - Eclipse CDT为什么说:“语法错误”,但是编译没问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/802410/