我的工作在现有C的代码有一些线路发言类似于这一:

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;
};

我使用日食CDT,它标志着与一个橙色的曲线为'的语法错误'。我认为这是标志着这样的CDT索引器。然而,汇编(手工终端)是没有问题。

这是一个有点不方便的,但是,由于元素的线路没有得到编制索引(所呼叫的层次结构中树并不总是正确的,或者突出的要素,等等。)

为什么Ecipse不喜欢线,因为它是?

有帮助吗?

解决方案

Eclipse CDT包含自己的预处理器/解析器,用于分析代码和构建索引。但是,当您调用构建CDT调用系统编译器时,例如gcc。 CDT解析器接受的语法与编译器接受的语法之间可能存在细微差别。当发生这种情况时,CDT解析器可能会混淆。

在我的系统上, offsetof 宏扩展为使用 __ offsetof __ 关键字的表达式。 CDT无法识别此关键字,因此存在语法错误的原因。为了解决这个问题,CDT解析器内置了一个宏来处理 __ offsetof __ ,如下所示:

#define __offsetof__(x) (x)

这似乎不正确,至少在我的系统上,结果是从源中删除了 __ offsetof __ 关键字,这仍然会导致语法错误。

我能够通过转到Paths and Symbols属性页面并为 __ offsetof __ 添加一个映射到'foo'的宏来摆脱语法错误。这使得解析器认为它只是对以前没有见过的函数的调用,而不是语法错误。

或者,您可以转到Window>关闭编辑器中的语法错误报告。偏好>一般>编辑>文字编辑器>注释和取消选中C / C ++ Indexer Markers的所有复选框。

其他提示

我已经使用Preferences-> C / C ++修复了eclipse CDT中的问题 - >语言映射:添加 内容类型:C-header 语言:C ++

似乎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;

尝试将索引器切换为“完整c / C ++索引器(完全解析)”。在首选项 - > c / C ++ - >索引

Iv得到了同样的问题。有2定义offsetof(一个用于C和一个用C++)。海事组织的问题来自

例如,如果我的类型

#ifndef __cplusplus
#endif

日食会灰色。它的意思是__cplusplus定义,但是我的项目是一个C

不幸的是我找不到一个解决方法。

我在新CDT项目向导中检查Makefile项目中的错误解析器选项卡,删除CDT Visual C错误解析器(我正在使用gcc)后修复了类似的问题

我最终解决了这个问题。首先,我打开了项目属性,然后是C / C ++ general-> Paths and Symbols类别。在符号选项卡下,我添加了以下条目:

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

这些符号由索引器使用但未传递给编译器(至少在Makefile项目中,我没有在其他类型的C项目中尝试过),因此它不会覆盖GCC的内置offsetof

我见过Eclipse有时会这样做,我将它用于Java。通常关闭并打开文件再次修复它(重置任何错误)。它通常似乎是一个错误,WAS那里但已被修复,并且“错误缓存”未正确更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top