2010-05-26 9 views
9

मुझे सी/सी ++ प्रश्न मिला है, क्या मैं फ़ंक्शन हेडर को दो बार लिखने के बिना विभिन्न ऑब्जेक्ट फ़ाइलों या परियोजनाओं में फ़ंक्शंस का पुन: उपयोग कर सकता हूं? (फ़ंक्शन को परिभाषित करने के लिए और इसे घोषित करने के लिए एक)फ़ंक्शन हेडर लिखने के तरीके दो बार नहीं?

मुझे सी/सी ++, डेल्फी और डी के बारे में बहुत कुछ पता नहीं है। मुझे लगता है कि डेल्फी या डी में, आप केवल एक बार लिखेंगे कि एक समारोह में क्या तर्क होता है और तो आप अलग परियोजनाओं में समारोह का उपयोग कर सकते हैं। और सी में आपको हेडर फाइलों में फ़ंक्शन घोषणा की आवश्यकता है * फिर से ??, है ना? क्या कोई अच्छा टूल है जो सी स्रोतों से हेडर फाइलें बनाएगा? मेरे पास एक है, लेकिन यह प्रीप्रोसेसर-जागरूक नहीं है और बहुत सख्त नहीं है। और मेरे पास कुछ मैक्रो तकनीक है जो बदतर काम करती है।

मैं C/C कार्यक्रम के तरीके ++ की तरह यहाँ वर्णित की तलाश में हूँ http://www.digitalmars.com/d/1.0/pretod.html

+1

मैं कैसे डी इस क्षेत्र में काम करता है पता नहीं है, लेकिन डेल्फी में यदि आप एक इकाई दिनचर्या है कि अन्य इकाइयों और कार्यक्रमों के द्वारा बुलाया जाएगा युक्त लिख रहे हैं, तो आप प्रक्रिया और समारोह घोषणाओं दो बार लिखने के लिए, एक बार में क्या है इंटरफेस अनुभाग, फिर कार्यान्वयन खंड में वास्तविक दिनचर्या के साथ। डेल्फी आईडीई इसके साथ कुछ मदद प्रदान करता है, लेकिन आखिरकार यह प्रोग्रामर पर निर्भर करता है कि वे सिंक में रहें। कंपाइलर निश्चित रूप से आपको बताएगा कि वे सिंक से बाहर हैं। इसे बनाए रखना मुश्किल नहीं है, यह प्रोग्रामर के काम का हिस्सा है यह जानकर कि कोड क्या कर रहा है। – Todd

+0

'डी' सी ++ की तुलना में जावा या सी # के करीब दिखता है। – egrunin

उत्तर

11

IMHO, स्रोत से हेडर पैदा एक बुरा विचार है और अव्यावहारिक है।

शीर्षलेखों में अधिक जानकारी हो सकती है जो केवल नाम और पैरामीटर कार्य करती हैं।

यहाँ कुछ उदाहरण हैं:

  • एक C++ हैडर एक सार वर्ग है जिसके लिए एक स्रोत फ़ाइल अनावश्यक हो सकता है परिभाषित कर सकते हैं
  • एक टेम्पलेट केवल एक हेडर फाइल
  • डिफ़ॉल्ट में परिभाषित किया जा सकता पैरामीटर केवल कक्षा परिभाषा में निर्दिष्ट हैं (इस प्रकार हेडर फ़ाइल में)

आप आमतौर पर आपको लिखते हैं आर हेडर, फिर एक संबंधित स्रोत फ़ाइल में कार्यान्वयन लिखें।

मुझे लगता है कि आसपास के दूसरे तरीके से काउंटर-सहज ज्ञान युक्त है और C या C++ की भावना के साथ फिट नहीं है।

एकमात्र अपवाद यह देख सकता है कि स्थिर फ़ंक्शंस है। एक स्थैतिक फ़ंक्शन केवल अपनी स्रोत फ़ाइल (.c या .cpp) में दिखाई देता है और (कहीं भी) कहीं और उपयोग नहीं किया जा सकता है।

जबकि मैं मानता हूँ यह अक्सर एक विधि/समारोह स्रोत फ़ाइल के हैडर परिभाषा कॉपी करने के लिए कष्टप्रद है, तो आप शायद यह कम करने के लिए अपने कोड संपादक कॉन्फ़िगर कर सकते हैं। मैं विम का उपयोग करता हूं और एक त्वरित लिपि ने मुझे इस के साथ बहुत मदद की। मुझे लगता है कि अधिकांश अन्य संपादकों के लिए एक समान समाधान मौजूद है।

वैसे भी, जबकि इस कष्टप्रद लग सकता है, यह भी एक अधिक सुविधा प्रदान करता ध्यान में रखना। आप अपनी हेडर फाइलें वितरित कर सकते हैं (.h, .hpp या जो कुछ भी) और फिर बाद में स्रोत फ़ाइलों में कार्यान्वयन को पारदर्शी रूप से बदल सकते हैं।

इसके अलावा, बस इसका उल्लेख करने के लिए, C/C++ जैसी कोई चीज़ नहीं है: C है और C++ है; वे अलग-अलग भाषाएं हैं (जो वास्तव में बहुत अधिक साझा करती हैं, लेकिन फिर भी)।

+2

हेडर में अतिरिक्त जानकारी के बारे में अच्छा बिंदु - शायद सदस्य फ़ंक्शंस के लिए डिफ़ॉल्ट पैरामीटर का उल्लेख करना चाहें केवल हेडर में निर्दिष्ट किया जा सकता है, और अधिकांश टेम्पलेट कोड केवल शीर्षलेखों में ही रहता है। – AshleysBrain

+0

@AshleysBrain: वास्तव में अच्छे उदाहरण। उन्हें मेरे जवाब में जोड़ा गया। धन्यवाद ! – ereOn

0

ध्यान में रखकर आप कुछ कार्यों की घोषणा की और उनके कार्यान्वयन लिखा था तुम एक ग/सीपीपी फ़ाइल और इसमें एक शीर्ष ज फ़ाइल होगा है।

आप उन कार्यों का उपयोग करने के क्या करना चाहिए क्या:

  1. एक पुस्तकालय बनाएँ (DLL/तो या स्थिर पुस्तकालय ए/उदारीकरण - अब के लिए मैं उपयोग में आसानी के लिए स्थिर पुस्तकालय की सलाह देते हैं) से फाइलें कार्यान्वयन थीं
  2. हेडर फ़ाइल (# इसे शामिल करें) का उपयोग करें (आप को चरण 1 से अपनी लाइब्रेरी के साथ फ़ंक्शन परिभाषाएं और लिंक प्राप्त करने के लिए अपने प्रोग्राम में फिर से हेडर फ़ाइल को फिर से लिखने के लिए की आवश्यकता नहीं है)।

हालांकि>this < विजुअल स्टूडियो के लिए एक उदाहरण है जो अन्य विकास वातावरण के लिए भी सही मायने रखता है।

+3

दरअसल आपको पुस्तकालय बनाने की ज़रूरत नहीं है। आप ऑब्जेक्ट फ़ाइल में बस लिंक कर सकते हैं (केवल पूर्णता के लिए)। –

+0

@ Space_C0wb0y सच – INS

0

यह एक मौलिक प्रश्न की तरह लगता है, तो यह सोचते हैं कि मैं गलत पढ़ा, यहाँ फिर से उपयोग की एक बुनियादी उदाहरण है, अपने पहले सवाल का जवाब देने नहीं है:

#include "stdio.h" 

int main(int c, char ** argv){ 
    puts("Hello world"); 
} 

स्पष्टीकरण: 1. stdio .h एक सी हेडर फ़ाइल है जिसमें (दूसरों के बीच) रखता है जिसे फ़ंक्शन() कहा जाता है। 2. मुख्य में, शामिल परिभाषा से,() कहा जाता है।

कुछ कंपाइलर्स (जीसीसी मुझे लगता है) में हेडर उत्पन्न करने का विकल्प होता है।

0

हमेशा verymuchconfusion सी ++ में शीर्षलेख और स्रोत-फ़ाइलों के बारे में है। मेरे द्वारा प्रदान किए गए लिंक को थोड़ा सा साफ़ करने में मदद करनी चाहिए।

यदि आप स्थिति में हैं कि आप स्रोत-फ़ाइल से शीर्षलेख निकालना चाहते हैं, तो आप शायद इसके बारे में गलत तरीके से गए। आमतौर पर आप पहले अपने फ़ंक्शन को हेडर-फ़ाइल में घोषित करते हैं, और उसके बाद स्रोत-फ़ाइल में इसके लिए कार्यान्वयन (परिभाषा) प्रदान करते हैं। यदि आपका फ़ंक्शन वास्तव में कक्षा का एक तरीका है, तो आप हेडर फ़ाइल में परिभाषा भी प्रदान कर सकते हैं।

तकनीकी तौर पर, एक हेडर फाइल सिर्फ पाठ का एक समूह है कि वास्तव में पूर्वप्रक्रमक द्वारा स्रोत फ़ाइल में डाला जाता है है:

#include <vector> 

ठीक उसी जगह पर फ़ाइल वेक्टर की सामग्री सम्मिलित करने पूर्वप्रक्रमक बताता है जहां #include प्रकट होता है। यह वास्तव में सिर्फ पाठ प्रतिस्थापन है। इसलिए, हेडर-फाइल किसी प्रकार की विशेष भाषा निर्माण नहीं हैं। उनमें सामान्य कोड होता है। लेकिन उस कोड को एक अलग फ़ाइल में डालकर, आप इसे प्रीप्रोसेसर का उपयोग करके अन्य फ़ाइलों में आसानी से शामिल कर सकते हैं।

+0

+1 शायद सबसे अच्छा जवाब – nico

+0

में से एक -1 यह कैसे हैडर/स्रोत फ़ाइलें काम का एक विवरण, नहीं प्रश्न का उत्तर है। –

+0

मेरी राय में जिस सवाल से पूछा गया था, वह बताता है कि ओपी हेडर काम करने के तरीके को समझ में नहीं आता है। अगर उसने किया, तो वह खुद अपने प्रश्न का उत्तर देने में सक्षम होगा। कोई भी जवाब जो उसकी समस्या हल करता है, लेकिन उसे पहले स्थान पर समझने में उसकी मदद नहीं करता है, वास्तव में बहुत मदद नहीं कर रहा है। मुझे लगता है कि मैंने खुद को समस्या हल करने के लिए आवश्यक सभी जानकारी प्रदान की है। –

0

मुझे लगता है कि यह एक अच्छा सवाल है जो मुझे इस पूछना करने के लिए नेतृत्व है: Visual studio: automatically update C++ cpp/header file when the other is changed?

कुछ रिफैक्टरिंग उल्लेख उपकरण हैं लेकिन दुर्भाग्य से मैं वहाँ एक सटीक समाधान नहीं लगता कि; आपको बस अपने फ़ंक्शन हस्ताक्षर दो बार लिखना होगा। अपवाद तब होता है जब आप अपनी कार्यान्वयन इनलाइन लिख रहे हैं, लेकिन ऐसे कई कारण हैं जिन्हें आप हमेशा ऐसा नहीं कर सकते हैं या नहीं करना चाहिए।

1

ऐसा लगता है कि आपको वास्तव में स्रोत से हेडर उत्पन्न करने की आवश्यकता नहीं है; आप एक फ़ाइल लिखने में सक्षम होना चाहते हैं और एक ऐसा उपकरण है जो बुद्धिमानी से इसे हेडर फ़ाइल और स्रोत फ़ाइल में विभाजित कर सकता है।

दुर्भाग्य से, मुझे इस तरह के किसी भी उपकरण से अवगत नहीं है। एक निश्चित रूप से लिखना संभव है - लेकिन आपको एक सी ++ फ्रंट एंड दिया जाना चाहिए।आप clang का उपयोग करके कुछ लिखने का प्रयास कर सकते हैं - लेकिन यह एक महत्वपूर्ण मात्रा में काम होगा।

0

आप Lazy C++ में रुचि हो सकती। हालांकि, आपको इस उपकरण का उपयोग करने से पहले कुछ परियोजनाओं को पुराने तरीके से (अलग-अलग शीर्षलेख और स्रोत फ़ाइलों के साथ) करना चाहिए। मैंने इसे स्वयं इस्तेमाल करने पर विचार किया, लेकिन फिर लगा कि मैं हमेशा lzz फ़ाइल के बजाय जेनरेट की गई फ़ाइलों को गलती से संपादित कर रहा हूं।

0

तुम बस हेडर फाइल में सभी परिभाषाओं डाल सकता है ...

यह common practice के खिलाफ जाता है, लेकिन unheard of नहीं है।

संबंधित मुद्दे