奇怪的语义错误

时间:2012-11-04 17:24:13

标签: c++ emacs cedet emacs-semantic

我在新的linux主机上重新安装了emacs 24.2.50,并基于magnars emacs配置启动了一个新的dotEmacs配置。由于我在之前的工作流程中使用了CEDET取得了一些成功,因此我开始配置它。但是,每当我加载C ++源文件时,都会有一些奇怪的行为。

[此部分已解决]
正如所料,语义解析所有包含的文件(并在初始设置期间解析由 semantic-add-system-include 变量指定的所有文件),但它会打印出如下所示的错误消息:< / p>

WARNING: semantic-find-file-noselect called for /usr/include/c++/4.7/vector while in set-auto-mode for /usr/include/c++/4.7/vector. You should call the responsible function into 'mode-local-init-hook'.

在上面的示例中,为STL向量打印错误,但是对于访问者和任何后续包含者所包含的每个文件,都会打印相应的错误消息。因此,完成需要相当长的时间,不幸的是,重复该过程的任何类型我打开一个新的缓冲区。

[此问题也解决了]
此外,当我将点放在非c基本类型(即不是int,double,float等)之上而不是在模式行中打印类型的定义时,解析看起来并不真正起作用。像

这样的错误消息

Idle Service Error semantic-idle-local-symbol-highlight-idle-function: "#<buffer DEPFETResolutionAnalysis.cc> - Wrong type argument: stringp, (((0) \"IndexMap\"))" Idle Service Error semantic-idle-summary-idle-function: "#<buffer DEPFETResolutionAnalysis.cc> - Wrong type argument: stringp, ((\"fXBetween\" 0 nil nil))"

其中 DEPFETResolutionAnalysis.cc 是文件&amp;缓冲区I当前正在编辑, IndexMap fXBetween 是文件I +#编辑所包含的文件中定义的类型/文件I&#包含的某个文件39; m编辑。

我还没有测试CEDET /语义的任何进一步功能,因为这个问题非常烦人。我的cedet配置可以找到here

编辑:在Alex Ott的帮助下,我解决了第一个问题。这是由于我可怕的cedet初始化。请参阅他的第一个答案,了解配置CEDET的正确方法! Idle Service Error仍然存在问题(当启用global-semantic-idle-local-symbol-highlight-mode时,它永久发生,不仅在检查点上类型的定义时)。
还有新的问题,如何禁用站点方式的init文件

EDIT2:我在发生问题的缓冲区中执行了semantic-debug-idle-function,它产生了~700kb [sic!]输出。看起来它正在对数据容器执行某些操作,根据它的外观,它包含有关解析文件中定义的所有符号的信息。因为我已经解析了一个相当大的包(~20Mb源文件),所以这个表相当大。可以语义处理数据库那么大或者这是不可能的,也是我问题的原因?

EDIT3:删除~/.semanticdb的内容并重新解析所有包含功能。我仍然需要禁用站点方式的init文件,但由于这与CEDET无关,我将关闭此问题(可以找到与站点方式的init文件相关的问题here)。

2 个答案:

答案 0 :(得分:6)

您需要更改您的init文件,以便它只执行一次CEDET加载,而不是在为每个.h / .hpp / .c / .cpp文件调用的挂钩中。您可以更改this config作为基础,并在following article中阅读更多内容。

你遇到的问题是因为Semantic试图分析头文件,当它试图打开头文件时,会再次调用它的初始化例程,并再次调用......

答案 1 :(得分:3)

第一个问题是通过正确配置在Alex Ott homepage上描述的CEDET来解决的。他的回答解决了第一个问题。他的答案中指定的配置文件是一个很好的配置的一个很好的开始;我已经使用了相同的配置CEDET来满足我的需求。

第二个问题在我将CEDET从1.1更新到bazaar(存储库)版本后消失了,该版本在here和Alex的文章中进行了解释。另外一个必须删除目录~/.semanticdb的内容(其中包含语义数据库并且我猜是已损坏)。

我要感谢Alex Ott的帮助,并在我解决问题的过程中坚持我:)