简介

用C和C ++编程时,通常将函数原型和实际函数分成.h / .hpp.c / .cpp文件。遗憾的是,将函数原型从一个文件传输到另一个文件非常繁琐,并且需要同时打开两个文件(或良好的内存),并且需要进行许多不必要的输入,尤其是当对参数或成员名称进行更改时

示例

foo.hpp

int someFunction(int someArgument);

class someClass
{
     public:
     someClass();
     ~someClass();

     int anotherFunction(int anotherArgument);
};


foo.cpp

#include "foo.hpp"

int someFunction(int someArgument)
{
    // Code goes here
}

someClass::someClass()
{
    // Code goes here
}

someClass::~someClass()
{
    // Code goes here   
}

int someClass::anotherFunction(int anotherArgument)
{
    // Code goes here
}


问题

是否可以使用foo.cpp中的定义和原型自动创建和更新foo.hpp中的函数?

#1 楼

ew,这很有趣!

:g/.*\n^{/yank A<cr>:bn<cr>pkdd:%s/$/;/<cr>:g/::/d B<cr>A<cr><cr>class <cr>{<cr>};<esc>"BP:%s/[^ ]\+:://<cr>j%jyt(kk$p=ipjA<cr>public:<esc>


您可以继续将其映射到.vimrc中的一个按键: br />
请注意,这假定构造函数是第一个出现的类方法。 (我可以解决这个问题,但是我想保持简单。如果需要修复,请在注释中提及。)

这也假设您的头文件缓冲区为空,并且位于紧随其后您的源文件缓冲区。

分步说明:

nnoremap <C-b> :g/.*\n^{/yank A<cr>:bn<cr>pkdd:%s/$/;/<cr>:g/::/d B<cr>A<cr><cr>class <cr>{<cr>};<esc>"BP:%s/[^ ]\+:://<cr>j%jyt(kk$p=ipjA<cr>public:<esc>


评论


尽管这令人印象深刻(我对vim相当陌生,所以我每天都在发现新事物!),但恐怕这根本不是我所需要的。也许我应该考虑制作自己的插件?看起来很有趣。

–卢卡斯
2015年2月6日,下午3:31

@Lukas您的.vimrc中的映射不能以什么方式解决问题?只需按Ctrl-B,即可自动为您填写头文件。 (在用更新的版本替换头文件之前,我可能应该先清除它的头文件,但是我必须睡觉,所以以后可以这样做。)如果您决定制作一个,请随时通知我。感谢您为提高我的Vim技能而遇到的有趣挑战! ;)

–门把手
2015年2月6日,下午3:52

这似乎在与请求相反的方向上起作用:它从.cpp文件创建头文件。

– 200_success
15年2月6日在18:51

...实际上也不错,但是我认为有些东西无法从定义中得知:例如,声明应该是内联的吗?有默认参数吗?是否应省略参数名称?

–凯尔·斯特兰德(Kyle Strand)
15年8月26日在17:52

@ 200_success啊,您是对的(我不知道为什么我没有早点回复您的评论)。有时间时,我将尝试编辑答案以另一种方式。

–门把手
15年8月26日在18:59



#2 楼

lh-cpp中的:GOTOIMPL命令能够从其声明中跳转到函数定义,或者在找不到该定义时提供默认的空定义。

我可以想到的一些功能:


该命令已经可以理解注释,异常规范以及不得复制(但可能在注释内复制)的关键字( virtualstatic,...)。
函数的当前作用域已解码(namespaces :: classes :: ...)并已正确报告(即,如果我们位于ns::namespace ns{上下文中,则不会以using namespace ns;作为前缀。

但是:


模板还没有被理解。
功能体是一个接一个地手动构建的-也就是说,我还没有是时候在ctags可能指向我的所有函数声明上执行:GOTOIMPL。