2012-03-05 16 views
5

मेरे पास कुछ सामान्य रूप से उपयोग किए गए मैक्रोज़ हैं जो मुझे लिखने वाली प्रत्येक सी फ़ाइल में सार्वभौमिक रूप से आवश्यक हैं। वर्तमान में मैं उन्हें प्रत्येक फ़ाइल में कॉपी कर रहा हूं जिसमें मुझे उनकी आवश्यकता है। यह संभवतः एक बुरा विचार है क्योंकि मुझे अंततः उनमें से एक को बदलने की आवश्यकता होगी और फिर मैं फ़ाइलों के बीच असंगत रूप से परिभाषित मैक्रोज़ के साथ समाप्त हो जाऊंगा।कई फ़ाइलों में सी मैक्रो का पुन: उपयोग करना

क्या मैक्रोज़ के लिए अनिवार्य रूप से हेडर फ़ाइल बनाने का कोई तरीका है? मैंने इसमें अपने सभी मैक्रोज़ के साथ हेडर बनाने की कोशिश की और इसमें शामिल है, लेकिन मुझे अभी भी कंपाइलर चेतावनियां मिलती हैं।

अद्यतन: मुझे प्राप्त होने वाली विशिष्ट चेतावनियां दूसरे उदाहरण से V4 जैसे कार्यों की निहित घोषणाएं हैं।

एक उदाहरण:

//file1.c 
#define COMMON_NUMBER 1 

//file2.c 
#define COMMON_NUMBER 1 

//... 

//fileN.c 
#define COMMON_NUMBER 1 

//Oh wait, it should have been 2 all along..... *facepalm* 

एक बेहतर उदाहरण:

//file1.c 
#include "usefulmacros.h" 

char* prog; 
int optv; 

int main(){ 
    prog = strdup(argv[0]);  
    optv = 4;   // This would be parsed from # of "-v" in argv[] 
    return 0; 
} 

void functionA(){ 
    int dumberror = 1; 
    V4("This is a fairly verbose error: %d",dumberror); 
} 

//file2.c 
#include "usefulemacros.h" 
extern char* prog; 
extern int optv; 

void functionB(){ 
    int differror = 2; 
    V4("This is a different error: %d",differror); 
} 

//usefulmacros.h 
#ifndef USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
+6

चेतावनी आप किस तरह के बारे में यहाँ बात कर रहे हैं लाइन

#define USEFULMACROS 

जोड़ने के लिए है? क्या हम अनुमान लगाएंगे? –

+1

यदि आपने सुना नहीं है, तो बहुत कम नौकरियां हैं जिनके लिए मैक्रोज़ सबसे अच्छा टूल हैं, और वे कई समस्याएं पैदा कर सकते हैं। उदाहरण के लिए, यह 'COMMON_NUMBER'' स्थिर 'वैश्विक चर (या बेहतर) हो सकता है। – Beta

+0

@ जेफमर्काडो: मैंने अपने प्रश्न को एक बेहतर उदाहरण के साथ अपडेट किया जो दिखाता है कि एक और विशिष्ट अर्थ में क्या हो रहा है। – Huckle

उत्तर

6
#ifndef COMMON_INCLUDE_FILE 
#define COMMON_INCLUDE_FILE 

#define COMMON_NUMBER 1 
#define OTHER_COMMON 2 

#endif 

सी, जहां मैक्रो थोड़ा और सी से व्यापक ++ जहां आप एक स्थिर वैश्विक के साथ क्या करना चाहते हैं, इसके बाद के संस्करण तंत्र काफी आम हैं। आपने फ़ाइल के शरीर के चारों ओर गार्ड शामिल किए हैं, और अपने कॉमन्स को परिभाषित किया है .. यह अनिवार्य रूप से config.h ऑटोकॉन्फ़ के साथ समाप्त होता है .. इसलिए कोई भी नहीं कह सकता कि यह सी कोड के लिए मानक तंत्र नहीं है।

बस किसी भी फाइल में सामान्य.h शामिल करें, इसे सौदा किया गया है।

+0

मुझे # idndef/# परिभाषित/# endif संरचना के बारे में पता है, मैंने अपने प्रश्न में और विवरण जोड़े हैं। – Huckle

+0

यह अभी भी वही उत्तर है जो मैंने पोस्ट किया है, ध्यान दें कि आपके प्रश्न _still_ में महत्वपूर्ण '#ifndef COMMON_INCLUDE_FILE \ n # परिभाषित COMMON_INCLUDE_FILE \ n \ n #endif \ n' .. वह विशेष रूप से हेडर गार्ड है जो आपके पूर्व-संसाधित कई बार होने से रोकता है (और आपकी डुप्लिकेट परिभाषा त्रुटियों का कारण है .. बाद में 'इसमें शामिल है', यदि COMMON_INCLUDE_FILE परिभाषित किया गया है, तो यह इसे फिर से संसाधित नहीं करेगा। – synthesizerpatel

2

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

आपको जो चेतावनियां दिखाई देती हैं उन्हें एक ही शीर्षलेख को कई बार शामिल करना पड़ सकता है। उन्हें बचाने के लिए आपको include guards का उपयोग करने की आवश्यकता है।

संपादित (प्रश्न अद्यतन के जवाब में)

का आपका क्रियान्वयन गार्ड #define USEFULMACROS याद आ रही है शामिल हैं। यह इस प्रकार है के रूप में किया जाना चाहिए:

//usefulmacros.h 
#ifndef USEFULMACROS 
#define USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
0

आप #ifndef के साथ USEFULMACROS मैक्रो परिभाषा की जांच करते हैं लेकिन आपने इसे कहीं भी परिभाषित नहीं किया है।

आप के बाद

#ifndef USEFULMACROS 
संबंधित मुद्दे