对于cedet的semantic,我快疯掉了

Vim、Emacs配置和使用
回复
old_bear
帖子: 3
注册时间: 2011-06-24 16:26

对于cedet的semantic,我快疯掉了

#1

帖子 old_bear » 2012-02-15 23:39

emacs23.2和cedet1.0.1
安装正常,加上gcc路径

代码: 全选

#include <string.h> // for strlen
#include <stdio.h> // for printf

int main ()
{
    strlen ("foo"); // can't find symbol
    printf ("bar"); // can find symbol
}
感到非常奇怪,string.h也能跟进去,为什么strlen没有呢?
看了strlen在string.h的定义:
extern size_t strlen (__const char *__s)
__THROW __attribute_pure__ __nonnull ((1));
原来semantic parser对于gcc扩展__attribute_pure__ __nonnull ((1))解析错误,导致strlen没出来
而printf没有这个扩展,故而可以跟踪
不死心,跟了下__attribute_pure__发现宏定义是空,__nonnull在cdefs.h里定义为gcc正常扩展,但在string.h里跟__nonnull死活进不到cdefs.h里,而是显示为一个函数:

代码: 全选

__attribute_pure__ __nonnull()
有人遇到这个问题吗?求高人指点,让parse忽略此类信息之类的方法

另外,顺便问一下cedet在sourceforge上的mailing list有人在吗?昨天发个邮件问这个组,结果还被退回说等审核。
emacs本身用的人少,谁都问不到,文档里没有的话,新手感觉叫天天不应,叫地地不灵的样子啊
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: 对于cedet的semantic,我快疯掉了

#2

帖子 fanhe » 2012-02-16 21:16

同情下楼主
我是自己写补全插件的,不过是 vim :em04
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

Re: 对于cedet的semantic,我快疯掉了

#3

帖子 tangboyun » 2012-02-17 0:38

查看semantic-lex-c-preprocessor-symbol-file函数说明,把config相关的头文件挂载下。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
old_bear
帖子: 3
注册时间: 2011-06-24 16:26

Re: 对于cedet的semantic,我快疯掉了

#4

帖子 old_bear » 2012-02-18 15:39

tangboyun 写了:查看semantic-lex-c-preprocessor-symbol-file函数说明,把config相关的头文件挂载下。
看了下help,这么做了,但奇迹地居然发现没有效果
(add-to-list 'semantic-lex-c-preprocessor-symbol-file "/usr/include/sys/cdefs.h")

在emacs内部看到semantic-lex-c-preprocessor-symbol-file变量确实包含/usr/include/sys/cdefs.h
但semantic-lex-c-preprocessor-symbol-map里什么都没加进去
手动打开/usr/include/sys/cdefs.h后semantic-lex-spp-describe,symbol全部正确解析,太TM奇怪了

事实上,我往semantic-lex-c-preprocessor-symbol-file中添加任何file都不会写到map里,但是打开文件semantic-lex-spp-describe后确有显示
而且我感觉cdefs.h这个文件,的确被string.h引用到了,就算没加spp table,我include <string.h>后,难道semantic不会去读cdefs.h后进行宏替换吗?
求指导
old_bear
帖子: 3
注册时间: 2011-06-24 16:26

Re: 对于cedet的semantic,我快疯掉了

#5

帖子 old_bear » 2012-02-18 19:55

终于搞定了!!哈哈哈,不容易啊

我觉得这个问题应该是非常普遍的,因为目前最新的release版就是有这个bug的
并且不能补全和跟踪标准c库的函数,还是非常大的缺陷

下面具体说下解决办法:
首先,问题起因是semantic无法解析gcc扩展(__atribute__pure __nonnull())的缘故
然而呢这些宏在/usr/include/sys/cdefs.h里定义了,而且string.h也include这个了
那为什么semantic无法执行宏替换呢?
semantic里的宏替换是只作用于定义宏的那个文件(这里是cdefs.h),尽管string.h里include了,但没用
这个标准c定义显然不同,semantic这么做显然是出于性能考虑

其次,如3楼所说,可以通过预先告诉semantic宏定义的方法,来解决这个问题,很容易找到变量
semantic-lex-c-preprocessor-symbol-file
文档说是semantic会解析其中的文件,把宏放到全局的符号表里
于是,如果你就这么简单的来一句
(add-to-list 'semantic-lex-c-preprocessor-symbol-file "/usr/include/sys/cdefs.h")
然后兴奋地打开emacs,就会超级郁闷的发现这TM根本不管用
C-h v semantic-lex-c-preprocessor-symbol-map
里面根本就没有,这不是坑爹吗?

故,最后还需要这一步:
原来cedet在load后,估计就直接拿初始的semantic-lex-c-preprocessor-symbol-file生成了semantic-lex-c-preprocessor-symbol-map
因此,尽管你load后添加了cdefs.h,但它已经不会再触发semantic重新生成map了
还有在刚才的那句话后,显示地调用一句
(semantic-c-reset-preprocessor-symbol-map)
这也太坑人了,bug不修也就算了,文档里一个字都没提

当然,以上主要参考自http://sourceforge.net/mailarchive/message.php?msg_id=27797694
BTW:有版上的同志在这个cedet的mailing list里吗?
这个怎么申请加入啊?我往list里发邮件,每次都要待审核。。
头像
abcbc
帖子: 42
注册时间: 2008-03-21 18:11
系统: Ubuntu 12.04

Re: 对于cedet的semantic,我快疯掉了

#6

帖子 abcbc » 2012-03-18 10:19

lz不说我还没发现这个,确实无法补全strlen,我这里是被try-expand-dabbrev补全了。
回复