查找定义我的C/C++;函数/宏大于';grep'; 我开始用一个C和C++文件的音调来完成一个巨大的项目,已经被别人写了。

查找定义我的C/C++;函数/宏大于';grep'; 我开始用一个C和C++文件的音调来完成一个巨大的项目,已经被别人写了。,c++,c,emacs,C++,C,Emacs,除了grep-r之外,还有什么更快/更简单的方法可以找到定义宏或函数的文件吗?它有点长 在某些IDE中,有一个神奇的东西,比如右键单击和“转到定义”。但我目前正在使用emacs。我不知道是否有任何定制可以做到这一点? 每次,我都必须复制到终端中的名称之后,运行grep并重新复制到emacs中的文件路径之后。(你知道,我很懒…grep如果将搜索限制在可能包含它的目录和文件类型(通常是.h和.hpp)上,那么它应该非常快。例如,如果您知道它在应用程序中,只需在那里搜索,如果您知道它来自FreeTyp

除了
grep-r
之外,还有什么更快/更简单的方法可以找到定义宏或函数的文件吗?它有点长

在某些IDE中,有一个神奇的东西,比如右键单击和“转到定义”。但我目前正在使用emacs。我不知道是否有任何定制可以做到这一点?
每次,我都必须复制到终端中的名称之后,运行
grep
并重新复制到emacs中的文件路径之后。(你知道,我很懒…

grep
如果将搜索限制在可能包含它的目录和文件类型(通常是
.h
.hpp
)上,那么它应该非常快。例如,如果您知道它在应用程序中,只需在那里搜索,如果您知道它来自FreeType(通常
FT.*
),请在那里搜索

更多的RAM将有助于系统更好地缓存文件,如果您使用HDD,最好使用SSD。如果您直接在VM上工作,特别是在使用远程磁盘的VM上工作,那么If可以在本地工作,这通常会更快


<> P>另外,很多完全功能化的IDE(VisualStudio、XCuide、Eclipse等)都有C++集成来跟踪这些东西,例如在一个符号上提供一个“转到声明”和“转到定义”选项作为一个快捷方式或上下文菜单。您可以尝试将CTAG与emacs一起使用,它将帮助您直接导航到函数声明。有关其用途,请参阅

您还可以探索Cscope,它比直接用于模式识别的ctags具有更好的功能集。但有时,您只需要浏览代码,ctags通常会完成这项工作

每次,我都必须复制到终端中的名称之后,运行
grep
并重新复制到emacs中的文件路径之后

您可以通过在Emacs内部使用
M-x rgrep
来改进这一点。它要求正则表达式、要查找的文件的全局模式以及要从中开始的目录。然后它执行递归grep,将结果输出到缓冲区中,您可以直接从点击跳转到相应的文件

对于glob模式,您可以键入类似于
*.c
的内容,或者可以使用变量
grep files alias
中定义的别名之一。例如,
ch
相当于
*。[ch]
(C源文件和头文件),
cchh
相当于
*.cc*[ch]xx*[ch]pp*[CHh]*.cc*[ch]+
(C++源文件和头文件)

您可能会发现,这样做非常有效,您不需要CTAG和其他答案和评论中建议的其他工具


为了便于在C中查找函数定义,有些项目使用定义中的函数名从第一列开始的约定:

/* this is just a declaration */
int main(int argc, char *argv[]);

/* in the definition, the function name starts on its own line */
int
main(int argc, char *argv[])
{
    ...

这意味着您可以使用regex
^main

找到定义,不包括对函数的任何调用。虽然我非常喜欢emacs(并且在IDE中使用emacs键绑定),但我还是建议您切换到某些IDE。您将从这种goto定义功能以及许多其他功能(GUI到调试器,…)中获益。我个人喜欢eclipse(特别是提供emacs KB),但还有很多其他的好方法。如果
grep-r
对您来说太长,请尝试;)我不使用emacs,但它看起来可以读取由生成的标记文件,以模拟IDE的“转到定义”功能。emacs wiki有一个关于这样一个文件的页面。@Aconcagua我没有使用过emacs,但是老式的编辑器可以像IDE一样方便。在VIM中,插件类的YouCompleteMe具有所有C++语义能力(CLAN后端)。用“代码> EtAgs<代码> >或任何标记,然后使用代码> m-。/COD>跳转到符号的定义。<代码> GRP是快速的,但使用时间较长(双拷贝过去)代码看起来很难看,但第一段: