2010-06-08 11 views
71

या तो सी या सी ++ में कोडिंग करते समय, मुझे #include कहां होना चाहिए?# .h या .c/.cpp में शामिल हैं?

callback.h:

#ifndef _CALLBACK_H_ 
#define _CALLBACK_H_ 

#include <sndfile.h> 
#include "main.h" 

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data); 
void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data); 

#endif 

callback.c:

#include <stdlib.h> 
#include <math.h> 

#include "config.h" 

#include "callback.h" 
#include "play.h" 

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) { 
    gint page; 
    page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->notebook)); 

    ... 

सभी या तो ज या ग/सीपीपी, या दोनों की तरह मैं यहाँ किया है में होना भी शामिल है चाहिए?

+2

मुझे इसे चारों ओर चालू करने दें और पूछें: sndfile.h और main.h को कॉलबैक.h में डालने का निर्णय लेने के लिए _your_ मानदंड क्या था? –

उत्तर

98

.c में जितना संभव हो उतना रखें और जितना संभव हो सके .h में रखें। .c में शामिल केवल तभी शामिल किया जाता है जब उस फ़ाइल को संकलित किया जाता है, लेकिन .h के लिए इसमें शामिल होने वाली प्रत्येक फ़ाइल द्वारा शामिल किया जाना चाहिए।

+4

सच है, लेकिन इसके शीर्ष पर '#ifndef _CALLBACK_H_' नहीं है, संकलक को इसे एक से अधिक बार संसाधित करने से रोकें? – hakermania

+8

@ user9379 यह इसे प्रति .c या .cpp फ़ाइल में एक से अधिक बार शामिल करने से रोक देगा। प्रत्येक .c या .cpp फ़ाइल आम तौर पर व्यक्तिगत रूप से निर्मित होती है, जिसका अर्थ है कि .h या .cpp फ़ाइल के लिए एक .h को फिर से पार्स किया जाएगा। –

+0

मुझे लगता है कि '.h' में जितना संभव हो उतना छोटा कारण डालने का मुख्य कारण कुछ मामलों में शामिल होने के कारण एक त्रुटि है।उदाहरण: दो वर्गों को उनके कार्यान्वयन के लिए एक-दूसरे की आवश्यकता है, लेकिन उनकी घोषणाओं के लिए नहीं। दोनों को '.cpp' में शामिल करना एक त्रुटि से बच जाएगा। – Codoscope

5

यदि मैं #include <callback.h>, तो मैं संकलित करने के लिए अपना कोड प्राप्त करने के लिए #include कई अन्य शीर्षलेख फ़ाइलों को नहीं रखना चाहता हूं। callback.h में आपको इसके खिलाफ संकलन करने के लिए आवश्यक सब कुछ शामिल करना चाहिए। लेकिन कुछ भी नहीं।

पर विचार आगे घोषणाओं (, मेरे संकलन समय और जटिलता बारी में और,) (जैसे class GtkButton; रूप में) अपने हेडर फाइल में उपयोग करते हुए पर्याप्त होगा, तो आप शीर्ष लेख में #include निर्देशों की संख्या को कम करने के लिए अनुमति है या नहीं।

+0

मैं असहमत हूं। एच फाइलों में पूरी दुनिया सहित निर्भरता श्रृंखला बढ़ जाती है और इसलिए समय संकलित करती है। –

+0

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

8

जितना संभव हो उतना सीपीपी में शामिल है और केवल एचपीपी में एचपीपी फ़ाइल द्वारा जरूरी है। मेरा मानना ​​है कि यह संकलन को तेज करने में मदद करेगा, क्योंकि एचपीपी फाइलों को क्रॉस-रेफरेंस कम किया जाएगा।

भी निर्भरता श्रृंखला शामिल करने के लिए अपनी एचपीपी फ़ाइल में forward declarations का उपयोग करने पर विचार करें।

+0

ओओ। आगे की घोषणा की बात दिलचस्प है। –

+0

परप्पा, आगे की घोषणा परिपत्र संदर्भ परिदृश्यों में बहुत उपयोगी हैं। लेकिन क्या वे अन्य परिदृश्यों में एक अच्छा अभ्यास करेंगे? (मैं सी ++ में नया हूं, इसलिए मैं ईमानदारी से पूछ रहा हूं) – Dzyann

28

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

#ifndef MY_HEADER_H 
#define MY_HEADER_H 

#include <stdio.h> 

void doStuffWith(FILE *f); // need the definition of FILE from stdio.h 

#endif 

है, तो शीर्ष लेख एक हैडर बी सीधे शामिल होना चाहिए। निर्भरता को पूरा करने के लिए .c फ़ाइल में शामिल करने का प्रयास करने का प्रयास करें (यानी हेडर ए से पहले हेडर बी समेत); यह एक बड़ा ओल 'दिल की धड़कन का ढेर होने का इंतजार कर रहा है। वाकई। मैं उस फिल्म में कई बार रहा हूं, और यह हमेशा टोक्यो के साथ आग लग गया।

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

बेशक, आपको उन फ़ाइलों को शामिल नहीं करना चाहिए जहां आप की आवश्यकता नहीं है।

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