emacs不能对程序中的宏进行有效解析,大家怎么处理的?

Vim、Emacs配置和使用
回复
firestone
帖子: 31
注册时间: 2008-07-21 10:02
送出感谢: 0
接收感谢: 0

emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#1

帖子 firestone » 2011-04-07 10:16

我主要进行c和c++编程,比如在头文件定义了一些宏,发现在进行跳转的时候emacs无法对宏定义的函数进行有效解析,大家有没有好方法能处理?我用过eclipse,发现它对宏能进行很好的解析。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#2

帖子 eexpress » 2011-04-07 10:17

何谓解析?

指语法高亮?
● 鸣学
firestone
帖子: 31
注册时间: 2008-07-21 10:02
送出感谢: 0
接收感谢: 0

Re: emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#3

帖子 firestone » 2011-04-07 10:49

比如智能跳转,和semantic-ia.......有关的。
我发现对同一个文件中定义的宏函数什么的还能有效跳转,但是如果我include其他头文件中定义的宏,总是不能有效跳转。目前我只有跳转到对应的头文件当中,然后看其中的宏是如何定义的。
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
送出感谢: 5 次
接收感谢: 13 次
联系:

Re: emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#4

帖子 tangboyun » 2011-04-07 16:24

宏就是宏,函数就是函数
那啥,你的意思是指?
是识别用#if之类条件预处理指令括起来的代码部分么?

理论上要做到,好像挺容易的 ,就是生成一个源代码的tmp buffer,然后去调用cpp预处理器,最后再解析一次,得到跳转的位置。不过估计是很难做到“通用”,还有就是如何取得这类条件跳转定义的常数,这些可以是编译时命令行定义的,也可能是编译器内部定义的。

自己针对自己需要的特定情况hack下,配合正则之类写个跳转函数不难,不过要做到那种标准插件的通用性的话,不太现实。。。
上次由 tangboyun 在 2011-04-07 16:31,总共编辑 1 次。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
firestone
帖子: 31
注册时间: 2008-07-21 10:02
送出感谢: 0
接收感谢: 0

Re: emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#5

帖子 firestone » 2011-04-07 16:29

我的意思是说有些函数用宏定义的方式,发现emacs找不到
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
送出感谢: 5 次
接收感谢: 13 次
联系:

Re: emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#6

帖子 tangboyun » 2011-04-07 16:37

最后问题还是归结到预处理器上啊,现有的插件不支持的话,解决思路就在上面了。。

不过我还是不清楚,你到底要实现的是啥功能?
是跳转到光标所在位置符号的定义么?这个好像比较简单,就不需要预处理器或者临时buffer之类的。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
送出感谢: 5 次
接收感谢: 13 次
联系:

Re: emacs不能对程序中的宏进行有效解析,大家怎么处理的?

#7

帖子 tangboyun » 2011-04-18 2:51

刚才翻了下cedet的代码的时候发现,楼主提的问题,其实只要设定下面这个变量,让sematic去调用cpp即可,不过只能一个一个去设,比较大的库可以解决问题,比如boost或者Qt4这种,其他自己写的小头文件的话,还是算了。
semantic-lex-c-preprocessor-symbol-file
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
回复

回到 “Vim和Emacs”