Rab*_*ski 14 c indexing eclipse-cdt
我正在使用现有的C代码,它有几行语句类似于这一行:
struct collect_conn *tc = (struct collect_conn *)
((char *)c - offsetof(struct collect_conn, runicast_conn));
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
我正在使用Eclipse CDT,它将带有橙色波浪线的行标记为"语法错误".我认为它是由CDT索引者标记的.但是,编译(在终端中手动)是没有问题的.
然而,这有点不方便,因为线上的元素没有被索引(因此调用层次结构树并不总是正确的,或者元素的突出显示等)
为什么Ecipse不喜欢这条线?
Mik*_*era 28
Eclipse CDT包含自己的预处理器/解析器,用于分析代码和构建索引.但是,当您调用构建CDT调用系统编译器时,例如gcc.CDT解析器接受的语法与编译器接受的语法之间可能存在细微差别.当发生这种情况时,CDT解析器可能会混淆.
在我的系统上,offsetof宏扩展为使用__offsetof__关键字的表达式.CDT无法识别此关键字,因此存在语法错误的原因.为了解决这个问题,CDT解析器内置了一个用于处理的宏__offsetof__,如下所示:
#define __offsetof__(x) (x)
Run Code Online (Sandbox Code Playgroud)
这似乎不正确,至少在我的系统上,结果是__offsetof__从源中删除了关键字,这仍然导致语法错误.
通过转到Paths and Symbols属性页面并添加一个__offsetof__映射到'foo' 的宏,我能够摆脱语法错误.这使得解析器认为它只是对以前没有见过的函数的调用,而不是语法错误.
或者,您可以通过转到窗口>首选项>常规>编辑器>文本编辑器>注释并取消选中C/C++索引器标记的所有复选框来关闭编辑器中的语法错误报告.
我已经使用Preferences-> C/C++ - >语言映射修复了eclipse CDT中的问题:添加内容类型:C-header语言:C++
小智 7
有时,虽然代码编译没有错误,但 Eclipse CDT 的实时代码分析器会显示 C/C++ 文件中的一些错误(例如,“函数 xxx 无法解析”)。这是因为 eclipse CDT 使用它自己的预处理器/解析器来分析代码和构建索引,而不是 MinGW 的(或任何其他 GNU 编译器)。为了为工作区中的所有 eclipse 项目全局修复此问题,请按照以下步骤操作:(为了仅针对特定项目修复此问题,请按照菜单“项目->首选项”中的步骤 1、2 和 4 )
1-在菜单' Window->Preferences->C/C++->Language Mappings '中,添加如下所示的正确映射:(例如,对于内容类型:C++源/头文件,使用GNU C++语言等)

2-在菜单“窗口->首选项->C/C++->索引器”中,通过选中所有复选框(但不是“跳过”)来设置完整索引,如下所示:

3-在每个项目的特定属性中,菜单' Project->Properties->C/C++ general->Indexer ',取消勾选'Enable project specific settings',如下图:

4-重建索引,菜单' Project->C/C++ Index->Rebuild '。
似乎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));
Run Code Online (Sandbox Code Playgroud)
如果您无法更改原始声明,请执行以下操作:
typedef struct collect_conn collect_conn_t;
Run Code Online (Sandbox Code Playgroud)