मैं भविष्य की परियोजनाओं के लिए आसानी से उनका उपयोग करने में सक्षम होने के लक्ष्य के साथ सी में कुछ डेटा संरचनाओं को कार्यान्वित कर रहा हूं। ऐसा करने का एक संभावित तरीका हैडर फ़ाइल में प्रत्येक डेटा संरचना को लागू करना है।
उदाहरण के लिए, यहाँ link_list.h है:
#ifndef LINKED_LIST
#define LINKED_LIST
#include <stdlib.h>
typedef struct linked_list_type {
int val;
struct linked_list_type* next;
} linked_list;
// Initializes a single node with a value v
linked_list* ll__init(int v) {
linked_list* new_ll = malloc(sizeof(linked_list));
new_ll->val = v;
new_ll->next = NULL;
return new_ll;
}
// More functions
#endif
यह अच्छी तरह से काम करता है, क्योंकि मैं भविष्य की परियोजना में लिंक्ड_लिस्ट संरचना और उसके सभी कार्यों को प्राप्त करने के लिए केवल #include "linked_list.h"
का उपयोग कर सकता हूं।
हालांकि, यह हेडर फ़ाइल में केवल घोषणाओं (और कार्यान्वयन नहीं) का उपयोग करने के सामान्य अभ्यास के विरुद्ध जाता है। तो, मेरे कुछ प्रश्न हैं:
- क्या इस तरह से आसान समावेशन प्राप्त करने का कोई बेहतर तरीका है? कुछ खोज से, ऐसा लगता है कि .c फ़ाइल को शामिल करना एक बुरा विचार है।
- क्या मैं अभी जो कर रहा हूं वह इस तरह से खराब/खतरनाक है कि मुझे इसका एहसास नहीं है?
2 जवाब
अपना पहला प्रश्न फिर से करें, मानक तरीका सिर्फ कोड को लिंक करना है, या तो किसी अन्य .c
फ़ाइल के रूप में या एक स्थिर पुस्तकालय में। लेकिन आप हर चीज के लिए inline
का भी इस्तेमाल कर सकते हैं। (हालांकि मैं इसे बड़ी डेटा संरचनाओं के लिए एक अच्छा समाधान नहीं मानता।)
अपना दूसरा प्रश्न फिर से करें, एक खतरा यह है कि यदि आप दो (या अधिक) संकलित फ़ाइलों को एक साथ जोड़ने का प्रयास करते हैं तो आपको एक लिंकर त्रुटि मिलेगी जो इस हेडर फ़ाइल का उपयोग करके अलग से संकलित की गई है। ll_init
प्रतीक प्रत्येक .o
फ़ाइल द्वारा परिभाषित किया जाएगा।
आपने मुझे ब्लेज़ मैथ लाइब्रेरी के बारे में याद दिलाया। यह काफी तेज गणित पुस्तकालय है जो केवल हेडर का उपयोग करता है। इसलिए। आप सभी कार्यान्वयनों को बहुत सारे inline
के साथ हेडर में रख सकते हैं। लेकिन संकलन थोड़ा धीमा होगा। जैसा कि मुझे याद है, godbolt ऑनलाइन कंपाइलर अक्सर मेरे लिए ब्लेज़ के साथ टाइमआउट हो जाता है।