# .हल्के में .h या .c / .cpp?


118

जब सी या सी ++ में कोडिंग की जाती है, तो मुझे कहां होना चाहिए #include?

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));

  ...

क्या सभी में .h या .c / .cpp, या दोनों तरह से शामिल होना चाहिए जैसे मैंने यहाँ किया है?


2
मुझे इस बारे में बताएं और पूछें: कॉलबैक में sndfile.h और main.h डालने का निर्णय लेने के लिए आपका क्या मापदंड था ?
ओवेन एस।

जवाबों:


161

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


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

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

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

1
@ Qu'est-cet'yont यही कारण है कि आप .h फ़ाइलों में कुछ चीज़ें नहीं डाल सकते हैं । यह उत्तर इस बारे में है कि आपको इससे कम क्यों रखना चाहिए।
ब्रेंडन लॉन्ग

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

55

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

#ifndef MY_HEADER_H
#define MY_HEADER_H

#include <stdio.h>

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

#endif

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

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

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


10

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

निर्भरता श्रृंखला को और कम करने के लिए अपनी hpp फ़ाइल में आगे की घोषणाओं का उपयोग करने पर भी विचार करें।


1
ऊ। आगे की घोषणाओं की बात दिलचस्प है।
ब्रेंडन लॉन्ग

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

5

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

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


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

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