डीएमएस का उपयोग करके इस विचार को लागू करने के लिए, आप संकलन चरण से पहले अपने स्रोत कोड पर C front end के साथ डीएमएस चलाएंगे। डीएमएस प्रीप्रोसेसर निर्देश का विस्तार किए बिना कोड को पार्स कर सकता है, इसका प्रतिनिधित्व करने वाले अमूर्त वाक्यविन्यास पेड़ बनाएं, एएसटी पर परिवर्तन करें, और फिर परिणाम को संकलित सी टेक्स्ट के रूप में थूक दें।
विशिष्ट परिवर्तन नियम आप का प्रयोग करेंगे है:
rule replace_SID_invocation(s:STRING):expression->expression
= "SID(\s)" -> ComputeCRC32(s);
जहां ComputeCRC32 कस्टम कोड है कि यह क्या कहते है। (डीएमएस में सीआरसी 32 कार्यान्वयन शामिल है, इसलिए इसके लिए कस्टम कोड बहुत छोटा है।
डीएमएस इस कार्य के लिए बहुत बड़ा हथौड़ा है। आप PERL का उपयोग कुछ समान रूप से लागू करने के लिए कर सकते हैं। PERL (या कुछ अन्य स्ट्रिंग के साथ अंतर मैच/हैक को प्रतिस्थापित करें) जोखिम है कि ए) यह पैटर्न कहीं भी मिल सकता है जहां आप प्रतिस्थापन नहीं चाहते हैं, उदाहरण के लिए
... QSID("foo")... // this isn't a SID invocation
जो आप शायद अपने पैटर्न मैच ध्यान से कोडिंग से ठीक कर सकते हैं, ख) एक सिड कॉल आश्चर्य की बात परिस्थितियों में पाया मैच के लिए असफल:
... SID (/* master login id */ "Joel") ... // need to account for formatting and whitespace
और ग) भागने के विभिन्न प्रकार संभाल करने में विफल अक्षर हैं जो शाब्दिक स्ट्रिंग में ही दिखाई देते हैं:
... SID("f\no\072") ... // need to handle all of GCC's weird escapes
डीएमएस के सी सामने अंत आप के लिए सभी पलायन संभालती है; उपरोक्त ComputeCRC32 फ़ंक्शन वास्तविक इच्छित वर्ण वाले स्ट्रिंग को देखेगा, न कि स्रोत कोड में कच्चे पाठ को देखते हैं।
तो यह वास्तव में एक बात है कि आप अंधेरे कोने के मामलों की परवाह करते हैं, या यदि आपको लगता है कि आपके पास अधिक विशेष प्रसंस्करण हो सकती है।
जिस तरह से आपने समस्या का वर्णन किया है, उसे देखते हुए, मुझे सबसे पहले पर्ल मार्ग पर जाने और मजाकिया मामलों को दूर करने का लुत्फ उठाना होगा। यदि आप ऐसा नहीं कर सकते हैं, तो बड़ा हथौड़ा समझ में आता है।
यह आपके प्रश्न का उत्तर नहीं दे रहा है, लेकिन क्या आपने अपनी टेम्पलेट फ़ाइल (उदाहरण के लिए 'example.c.tmpl') लेते हुए एक समर्थन स्क्रिप्ट लिखने पर विचार किया है, सीआरसी की गणना करता है और आउटपुट फ़ाइल में प्रतिस्थापन करता है (उदाहरण के लिए' example.c') अपनी मेक प्रक्रिया के हिस्से के रूप में? –
मेरी स्थिति में यह असुविधाजनक है क्योंकि मेरे पास कोई विशेष टेम्पलेट नहीं है, इसलिए ये एसआईडी मैक्रो स्रोत कोड में कहीं भी हो सकता है। बेशक, मैं एक कस्टम मेक लक्ष्य जोड़ सकता हूं जो सभी * .cpp स्रोतों को एक साधारण स्क्रिप्ट बदलते हुए एसआईडी मैक्रो के साथ संसाधित करता है और फिर मैग्लेड स्रोतों को जीसीसी में पास करता है .... लेकिन मुझे लगता है कि एक कस्टम प्रीप्रोसेसर का उपयोग करना अधिक सुरुचिपूर्ण हो सकता है। – pachanga
क्या आपने मानक तरीके से प्रयास किया है: #undef SID # एसआईडी परिभाषित करें? –