c - सी में, मैक्रो को अन्य मैक्रोज़ का उपयोग करके कैसे परिभाषित किया जा सकता है, जब कि दूसरे मैक्रोज़ नाम का विरोध करते हैं



scope macros (1)

यह उसके बाद एक अनुवर्ती सवाल है (कृपया मेरे प्रश्न को अंत में पढ़िए): सी में # परिभाषा से आने वाले नाम के संघर्षों से कैसे बचें? (या सी ++) मान लीजिए मैं #define का उपयोग करके पंक्ति और सी को परिभाषित करता हूं मैं तब आरओईएस और सीएएल का प्रयोग करके एआरआरएसआईएसआईएस को परिभाषित करता हूं। मैं एक स्थिर सरणी घोषित करता हूं जैसे float myarray[ARRSIZE]; । जब मैं ROW और COL को संशोधित करता हूं, तो स्थिर सरणी आकार तदनुसार बदलता है। लेकिन मेरे विशेष मामले में, नाम आरओओ और सीओएल नाम- एक स्ट्रक्चर प्रकार के एक सदस्य के नाम के साथ संघर्ष मैं उसी फाइल में उपयोग कर रहा हूं। किसी ने मुझसे कहा था कि कॉन्स्ट चर का उपयोग करने के लिए '# डिफाइन' का प्रयोग करने के बजाय कन्फिट से बचने के लिए मुझे पसंद आया कि मैंने कोड को बेलो के रूप में संशोधित किया (यह एक exmple है)

const int ROW = 100;
const int COL = 200;
const int ARRSIZE = ROW*COL;
float myarray[ARRSIZE];

इसका अनुपालन मुझे देता है

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ARRSIZE'

उस पंक्ति पर जहां मैं ARRSIZE को परिभाषित करता हूं बेशक मैं int ARRSIZE = ROW*COL; उपयोग कर सकते हैं int ARRSIZE = ROW*COL; फ़ंक्शन के अंदर और गतिशील रूप से malloc का उपयोग कर फ़ंक्शन के अंदर सरणी आवंटित करें। लेकिन क्या अगर मैं केवल ROW और COL को बदलना चाहता हूं और malloc का उपयोग नहीं करना चाहता हूं? बेशक, #define के साथ ऐसा करते समय कोई समस्या नहीं है (नाम विरोध को छोड़कर)

#define ROW 100
#define COL 200
#define ARRSIZE ROW*COL
float myarray[ARRSIZE];

तो समस्या: मैं केवल ROW, COL को बदलना चाहता हूं और स्थिर सरणी का आकार स्वचालित रूप से बदलना चाहता हूं, लेकिन उसी समय, ROW और COL समान स्रोत फ़ाइल में एक प्रकार (एक संरचना) के सदस्य चर के रूप में दिखाई देता है, और I प्रकार के सदस्य नाम को ठीक नहीं कर सकते (मान लें कि सिस्टम द्वारा प्रदान की जाने वाली हेडर फाइल से है) तो एक शब्द में, मैं एक 'मैक्रो जैसी मूल्यों' को परिभाषित करना चाहता हूं जो किसी सदस्य फ़ंक्शन / वेरिएबल या ग्लोबल वैरिएबल पर लागू नहीं होता है। मेरे मामले में यह करने के लिए सबसे अच्छा अभ्यास क्या है? बस मेरी चर रोब और सीएएल को कुछ विशेष में परिवर्तित करें? इस सवाल से पूछे जाने पर, मुझे एक इंप्रेशन मिलता है जो एकमात्र समाधान हो सकता है .. :)


उत्तर देने के लिए टिप्पणियां संकलित करना:

समाधान ए,
यदि आप किसी कारण के लिए अपने कोड में "ROW" और "COL" के साथ रहना है (मेलपॉमीन के लिए क्रेडिट):

enum { ROW = 100 }; 
enum { COL = 200 }; 
enum { ARRSIZE = ROW*COL };

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

(मैंने देखा है कि मैल्मोमोनेन कहीं और एक उत्तर के लिए प्रतिष्ठा में दिलचस्पी नहीं ले रहा है, बहुत ही परमात्मा। मुझे लगता है कि यह एक अच्छी क्यू / एक जोड़ी बनाने लायक है और मैल्मोमेल से कुछ नहीं लेता है।)