为什么蚀CDT说:'语法错误',但汇编没有问题
-
03-07-2019 - |
题
我的工作在现有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;
可能会感到困惑,请检查您是否有的定义 offsetof 范围内。否则,您可以尝试简化表达式,使用例如带有
offset
的 #define
或其他东西。
我认为编译器可能提供 offsetof
的内置版本,而Eclipses的编译器/代码解析器可能不会。如果是这样,您需要确保定义,以便Eclipse能够正确地解析您的代码。
尝试将索引器切换为“完整c / C ++索引器(完全解析)”。在首选项 - > c / C ++ - >索引
有时,虽然代码编译没有错误,但是eclipse CDT的实时代码分析器显示了C / C ++文件中的一些错误(例如,'函数xxx无法解析)。这是因为eclipse CDT使用自己的预处理器/解析器来分析代码并构建索引,而不是MinGW的(或任何其他GNU编译器)。为了全局修复工作区中的所有eclipse项目,请按照下列步骤操作: (为了仅针对特定项目修复此问题,请按照菜单'项目 - >偏好设置'中的步骤1,2和4进行操作)
1 - 在菜单'窗口 - >偏好设置 - > C / C ++ - >语言映射'中,添加正确的映射,如下所示:(例如,对于内容类型:C ++源/头文件,使用GNU C ++语言等) 全球语言映射设置
2 - 在菜单'窗口 - >首选项 - > C / C ++ - >索引器'中,通过选中所有复选框(但不是'跳过'复选框)来设置完整索引,如下所示下面: 全球索引器设置
3 - 在每个项目的特定属性中,菜单“项目 - >属性 - > C / C ++通用 - >索引器”,取消选中“启用项目特定设置”,如下所示: 项目索引器设置
4 - 重建索引,菜单'项目 - > 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那里但已被修复,并且“错误缓存”未正确更新。