हेडर फ़ाइलों से फ़ंक्शन प्रोटोटाइप से स्वचालित रूप से फ़ंक्शन बना रहा है


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
हालांकि यह प्रभावशाली है (मैं बहुत नया हूं, इसलिए मैं हर दिन नई चीजों की खोज कर रहा हूं!), मुझे डर है कि मुझे इसकी बिल्कुल भी जरूरत नहीं है। शायद मुझे अपना खुद का प्लगइन बनाना चाहिए? यह एक मजेदार बात लगती है।
लुकास

2
@ लुकास किस तरह से आपके .vimrc में मैपिंग समस्या को हल नहीं करता है? बस Ctrl-B मारना फिर स्वचालित रूप से आपके लिए हेडर फ़ाइल को भर देगा। (मुझे अद्यतन संस्करण के साथ बदलने से पहले हेडर फ़ाइल को संभवतः स्पष्ट करना चाहिए, लेकिन मुझे सोना होगा ताकि मैं बाद में ऐसा कर सकूं।) एक प्लगइन दिलचस्प लगता है; यदि आप एक बनाने का निर्णय लेते हैं तो मुझे अपडेट रखें। और दिलचस्प चुनौती के लिए धन्यवाद मेरे विम कौशल को तेज करने के लिए! ;)
Doorknob

2
यह अनुरोध से विपरीत दिशा में काम करने लगता है: यह .cpp फ़ाइल से एक हेडर फ़ाइल बनाता है।
200_success

... जो वास्तव में अच्छा भी होगा, लेकिन मुझे लगता है कि कुछ चीजें हैं जिन्हें परिभाषा से नहीं जाना जा सकता है: उदाहरण के लिए, क्या घोषणा होनी चाहिए inline? क्या डिफ़ॉल्ट तर्क हैं? क्या तर्क नामों को समाप्त किया जाना चाहिए?
काइल स्ट्रैंड

@ 200_success आह, आप सही कह रहे हैं (मुझे नहीं पता कि मैंने पहले आपकी टिप्पणी का जवाब क्यों नहीं दिया)। जब मेरे पास समय होगा, तो मैं दूसरे तरीके से जाने के लिए अपने उत्तर को संपादित करने का प्रयास करूंगा।
डोरकनॉब ऑग

3

:GOTOIMPLसे आदेश lh-सीपीपी इसकी घोषणा के एक समारोह परिभाषा के लिए कूद करने के लिए, या मामले से कोई भी में एक डिफ़ॉल्ट खाली परिभाषा मिला था प्रदान करने में सक्षम है।

कुछ विशेषताएं जो मैं सोच सकता हूं:

  • कमांड पहले से ही टिप्पणियों, अपवाद विनिर्देशों, कीवर्ड को समझता है जिन्हें कॉपी नहीं किया जाएगा (लेकिन संभवतः टिप्पणियों के भीतर कॉपी किया गया है) virtual, ( static, ...)।
  • फ़ंक्शन का वर्तमान स्कोप डिकोड किया गया है (नाम स्थान :: कक्षाएं :: ...) और सही तरीके से रिपोर्ट किया गया है (अर्थात यह उपसर्ग नहीं होगा ns::यदि हम namespace ns{किसी using namespace ns;संदर्भ या संदर्भ में हैं।

तथापि:

  • टेम्प्लेट्स अभी तक समझ में नहीं आए हैं।
  • फ़ंक्शन बॉडी को मैन्युअल रूप से एक के बाद एक बनाया जाना है - यानी मैंने अभी तक निष्पादित करने का समय नहीं लिया है: सभी फ़ंक्शन घोषणाओं पर GOTOIMPL जो कि ctags मुझे इंगित कर सकते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.