2017-12-15 159 views
5

मुझे लगता है कि उत्तर नहीं है, और मुझे आमतौर पर स्रोत कोड के माध्यम से परेशानी नहीं होती है, लेकिन मैं सी/सी ++ के लिए थोड़ा नया हूं और यह नहीं कह सकता कि यह निरंतर कहां घोषित किया गया है।क्या सी स्थिरता का जिक्र करने का कोई तरीका है जिसे कभी परिभाषित/घोषित नहीं किया गया था?

मैं में CMD_REQ_REDIS_MGET की तलाश में हूं। मैंने इसके लिए एक github/google खोज की और पांच घटनाओं के लिए बिल्कुल दो फाइलों में परिणाम मिला। मैंने स्रोत कोड में स्ट्रिंग के लिए grep करने का भी प्रयास किया।

$ grep -rnw ./ -e "CMD_REQ_REDIS_MGET" 
./command.c:241: case CMD_REQ_REDIS_MGET: 
./command.c:574:     r->type = CMD_REQ_REDIS_MGET; 
./hircluster.c:3257:  if (command->type == CMD_REQ_REDIS_MGET) { 
./hircluster.c:3446:  if (command->type == CMD_REQ_REDIS_MGET) { 
./hircluster.c:3480: if (command->type == CMD_REQ_REDIS_MGET) { 

स्रोत कोड में कोई भी बाइनरी नहीं है और इसे स्वयं निहित माना जाता है। इसमें रेडिस से संबंधित बाहरी स्रोतों से कोई भी पुस्तकालय शामिल नहीं है, और इसलिए मैं कुछ घंटों तक उलझन में हूं।

मुझे यह जानने की आवश्यकता है कि मैं इस तरह एक और स्थिरता जोड़ने की कोशिश कर रहा हूं, और मुझे त्रुटियां मिल रही हैं कि घोषणा नहीं मिली है, इसलिए मुझे आश्चर्य है कि यहां कोई काला जादू हो रहा है या नहीं सी कि मुझे बस पता नहीं है।

संपादित करें: यह इंगित करना चाहता था कि यह कोड वास्तव में संकलित होगा।

+0

क्या आप वाकई उचित स्तर पर grep कर रहे हैं? ऐसी परिभाषाएं आमतौर पर .h फ़ाइल में होती हैं। –

+0

@ जीन-फ्रैंकोइसफैबर मैं इसे गिट रेपो –

उत्तर

10

स्थिरता का उपयोग करना संभव नहीं है जिसे पहले घोषित नहीं किया गया था। लेकिन उस मामले में, निरंतर घोषित किया गया था, लेकिन मामूली नहीं।

आप कहीं भी (यह हेडर फाइल में होना चाहिए) स्ट्रिंग नहीं मिलता क्योंकि उन मूल्यों टोकन चिपकाने (## ऑपरेटर कि पुराने लोगों के संयोजन के द्वारा नए पहचानकर्ता बनाता है) का उपयोग कर command.h से एक मैक्रो में परिभाषित कर रहे हैं:

#define DEFINE_ACTION(_name) CMD_##_name, 
typedef enum cmd_type { 
    CMD_TYPE_CODEC(DEFINE_ACTION) 
} cmd_type_t; 
#undef DEFINE_ACTION 

ताकि आपको कभी भी CMD_ + आपका प्रत्यय नहीं मिले। फिर कुछ जादू (मैक्रो का नाम शायद कुछ बिंदु पर नए सिरे से परिभाषित किया जाता है) द्वारा, निम्नलिखित सभी तत्वों को परिभाषित करता है:

#define CMD_TYPE_CODEC(ACTION)                  \ 
    ACTION(UNKNOWN)                    \ 
    ACTION(REQ_REDIS_DEL)     /* redis commands - keys */       \ 
    ACTION(REQ_REDIS_EXISTS)                  \ 
    ACTION(REQ_REDIS_EXPIRE)                  \ 
    ACTION(REQ_REDIS_EXPIREAT)                 \ 
    ACTION(REQ_REDIS_PEXPIRE)                  \ 
    ACTION(REQ_REDIS_PEXPIREAT)                 \ 
    ACTION(REQ_REDIS_PERSIST)                  \ 
    ACTION(REQ_REDIS_PTTL)                  \ 
    ACTION(REQ_REDIS_SORT)                  \ 
    ACTION(REQ_REDIS_TTL)   

इस तरह के मैक्रो कॉपी/पेस्ट से बचने के लिए बहुत उपयोगी होते हैं, लेकिन जब आप नरक की कोशिश कर रहे हैं grep का उपयोग कर कोड में अपना रास्ता ढूंढें।

+0

ओह मैन की जड़ पर कर रहा हूं, ऐसा नहीं पता था कि ऐसा संभव हो सकता है .. मैं सी मैक्रोज़ पर और अधिक शोध करूंगा। मैं वास्तव में आप के लिए यह देखकर सराहना करता हूं! (जैसे ही मुझे अनुमति है, मैं स्वीकार करूंगा) –

+2

'##' * टोकन-पेस्टिंग * ऑपरेटर है। एक एकल '#' वर्ण (यहां उपयोग नहीं किया गया है) * स्ट्रिंगिंग * (नहीं "* स्ट्रिंग *") ऑपरेटर है (मुझे नहीं लगता कि मानक उस शब्द का उपयोग करता है)। –

+0

@ किथ थॉम्पसन हाँ, मैं नामों के साथ बहुत अच्छा नहीं हूं। मैं संपादित करूंगा। –

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

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