我在现有的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/

10-11 17:19