헤더 파일에서 함수 프로토 타입에서 함수 자동 생성


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있습니까?

답변:


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을 처음 접하므로 매일 새로운 것을 발견하고 있습니다!), 이것이 내가 필요한 것이 아니라는 것이 두렵습니다. 나만의 플러그인을 만들어야 할까? 재미있는 일인 것 같습니다.
Lukas

2
@Lukas .vimrc의 매핑이 어떤 방식으로 문제를 해결하지 않습니까? Ctrl-B를 누르면 헤더 파일이 자동으로 채워집니다. (업데이트 된 버전으로 교체하기 전에 헤더 파일을 지워야하지만 나중에 잠을 잘 수 있도록 잠을 자야합니다.) 플러그인이 흥미롭게 들립니다. 당신이 하나를하기로 결정하면 나를 계속 업데이트하십시오. 그리고 Vim 기술을 연마하는 흥미로운 도전에 감사드립니다! ;)
Doorknob

2
이것은 요청과 반대 방향으로 작동하는 것 같습니다. .cpp 파일에서 헤더 파일을 만듭니다.
200_success

... 실제로는 좋을지 모르지만, 정의에서 알 수없는 것들이 있다고 생각합니다. 예를 들어 선언은 inline? 기본 인수가 있습니까? 인수 이름을 생략해야합니까?
Kyle Strand

@ 200_success 아, 네 말이 맞아 (왜 내가 왜 당신의 의견에 대답하지 않았는지 모르겠습니다). 시간이 있으면 다른 방법으로 답변을 편집하려고합니다.
Doorknob

3

lh-cpp:GOTOIMPL명령은 선언에서 함수 정의 로 건너 뛰거나없는 경우 기본 빈 정의를 제공 할 수 있습니다.

내가 생각할 수있는 일부 기능 :

  • 이 명령은 이미 의견, 예외 사양, 복사 (그러나 가능하게 의견 내에서 복사) 할 수 없다 키워드를 이해 ( virtual, static, ...).
  • 함수의 현재 범위는 디코딩되고 (네임 스페이스 :: 클래스 :: ...) 올바르게보고됩니다 (즉 , 컨텍스트 ns::내에 namespace ns{있거나 using namespace ns;컨텍스트 인 경우 접두사가 붙지 않습니다) .

하나:

  • 템플릿은 (아직) 이해되지 않습니다.
  • 함수 본문은 하나씩 수동으로 빌드됩니다. 즉, ctags가 나를 가리킬 수있는 모든 함수 선언에서 : GOTOIMPL을 아직 실행하는 데 시간이 걸리지 않았습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.