从头文件自动从函数原型中创建函数


10

介绍

使用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

Answers:


3

哇,这很有趣!

: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中的单个按键:

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>

请注意,这假定构造函数是第一个出现的类方法。(我可以解决这个问题,但是我想保持简单。如果需要修复,请在评论中提及。)

这也假定您的头文件缓冲区为空,并且位于源文件缓冲区之后。

分步说明:

:g/.*\n^{/yank A<cr>            Yank all the function definitions (power of g!)
:bn<cr>                         Move to the header file buffer
pkdd                            Put in the function definitions
:%s/$/;/<cr>                    Add semicolons
:g/::/d B<cr>                   Grab the class methods and put them in register B
A<cr><cr>class <cr>{<cr>};<esc> Self-explanatory, add class skeleton
"BP                             Put the class methods in the class
:%s/[^ ]\+:://<cr>              Remove someClass::
j%jyt(kk$p                      Add the actual class name
=ip                             Fix indentation
jA<cr>public:<esc>              Add the `public:' modifier

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

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

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

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

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

3

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

我能想到的一些功能:

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

然而:

  • (尚未)了解模板。
  • 函数体要一个接一个地手动构建-即我还没有花时间对ctags可能指向我的所有函数声明执行:GOTOIMPL。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.