2011-02-18 11 views
7

क्या किसी को m4 के अलावा ऑटोकॉन्फ (अधिमानतः एसी या सी ++ पर्यावरण में) के अलावा किसी भी शैक्षणिक अंश से अधिक है, क्योंकि इससे किसी समस्या को हल करने में मदद मिली है (उदाहरण के लिए 'मानक' प्रीप्रोसेसर के साथ) हल करने में मुश्किल है।autoconf के अलावा m4 की वहाँ उल्लेखनीय उपयोगों हैं?

मैं यह पूछता हूं क्योंकि मैं सी ++ में एक परियोजना करने के तरीके के बारे में सोच रहा हूं जहां मैं स्क्रिप्ट, प्रीप्रोसेसर, व्हाटवर्स का उपयोग करके अनावश्यकता को कम या कम करना चाहता हूं।

+7

यह (शायद अभी भी है) sendmail कॉन्फ़िगरेशन फ़ाइलों के लिए उपयोग किया गया था। जो शायद एम 4 और sendmail दोनों के खिलाफ एक तर्क है। –

उत्तर

4

मैंने एक बार विंडोज़ विजुअल स्टूडियो प्रोजेक्ट के लिए एक साधारण संस्करण स्ट्रिंग (MAJOR.MINOR.MICRO-STATUS), और उपवर्तन से जानकारी वाली टेक्स्ट फ़ाइल से सी ++ हेडर फ़ाइल उत्पन्न करने के लिए एम 4 का उपयोग किया है।

m4 सबसे छोटा मैक्रो इंजन था जिसे मैं आसानी से एम्बेड और इस विशिष्ट लक्ष्य के लिए उपयोग कर सकता था।

#ifndef __VERSION_H__ 
#define __VERSION_H__ 
divert(-1) 
define(`CPP_DEFINE', `#define $1 $2') 
define(`VERSION', include(`version.txt')) 
define(`MY_SOFTWARE_MAJOR', regexp(VERSION, `\([0-9]+\)\.[0-9]+\.[0-9]+', `\1')) 
define(`MY_SOFTWARE_MINOR', regexp(VERSION, `[0-9]+\.\([0-9]\)+\.[0-9]+', `\1')) 
define(`MY_SOFTWARE_MICRO', regexp(VERSION, `[0-9]+\.[0-9]+\.\([0-9]\)+', `\1')) 
define(`MY_SOFTWARE_STATUS', regexp(VERSION, `\(-\w+\)', `\1')) 
define(`SVN_REV', `regexp(esyscmd(svnversion -n), `[0-9]+', `\&')') 
ifelse(len(SVN_REV), 0, `define(`NO_SVN')') 
divert 
CPP_DEFINE(MY_SOFTWARE_VERSION, format(`"%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO)) 
CPP_DEFINE(PRODUCT_VERSION, format(`"%s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, MY_SOFTWARE_STATUS)) 
CPP_DEFINE(COPYRIGHT_NOTICE, `"Copyright (C) 2008 - Me"') 
ifdef(`NO_SVN', ` 
CPP_DEFINE(ABOUT_VERSION, format(`"My Software Version %s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, MY_SOFTWARE_STATUS)) 
CPP_DEFINE(FILE_VERSION, format(`"%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO)) 
CPP_DEFINE(INFO_VERSION, format(``%s,%s,%s,0'', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO)) 
', ` 
CPP_DEFINE(ABOUT_VERSION, format(`"My Software Version %s.%s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV, MY_SOFTWARE_STATUS)) 
CPP_DEFINE(FILE_VERSION, format(`"%s.%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV)) 
CPP_DEFINE(INFO_VERSION, format(``%s,%s,%s,%s'', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV)) 
') 
#endif /* __VERSION_H__ */ 

हालांकि यह पूरी तरह से काम किया है, यह वास्तव में एक प्रयोग है कि मैं दोहराना नहीं किया था, जिसका मुख्य कारण मैं अब सीधे सामान को संभालने के लिए CMake के अंतर्निहित क्षमताओं का उपयोग पसंद करते हैं और मेरी दृश्य उत्पन्न किया गया था:

यह इस तरह देखा स्टूडियो परियोजना फाइलें।

2

मैंने m4 का उपयोग किया है और इसकी क्षमताओं से प्रभावित था, यह सी प्रीप्रोसेसर क्या होना चाहिए। मैंने इसे सरल परियोजना विवरणों से जीएनयू मेकफ़ाइल बनाने के लिए उपयोग किया।

2

मैं एक बार यह प्रयोग किया जाता एक पैशाचिक SQL क्वेरी के टुकड़े उत्पन्न करने के लिए। मुद्रित, क्वेरी लगभग 20 पृष्ठों तक चली - लगभग 1200 लाइनें, मुझे लगता है। मैं बहुत यकीन है कि मैं इसे m4 के बिना नहीं किया जा सकता है कर रहा हूँ, और मैं आभारी मैं इसे कभी भी फिर से करने की जरूरत नहीं जाएगा।


(एक टिप्पणी का जवाब देते हुए।।।)

IIRC (30 साल पहले से), क्वेरी अभियोगी की एक रिपोर्ट चलाई। अभियोगी को उनके इतिहास के संयोजनों के संयोजन द्वारा वर्गीकृत किया गया था।

एसक्यूएल इंजन दृश्य पर एक दृश्य नहीं बना सका, और उपयोगकर्ता द्वारा परिभाषित कार्यों का समर्थन नहीं किया। व्युत्पन्न टेबल, subselects, आदि के लिए कुछ लंबे भाव, या तो

  • समान किया गया जाना चाहिए था, लेकिन नहीं थे, या
  • आसानी से अलग किया जाना चाहिए था (जरूरत '-' के बजाय '+', या ' shsapnm 'के बजाय' shsgpnm '), लेकिन गलत तरीके से भिन्न थे।

कठिन हिस्सा प्रोग्रामिंग नहीं था।

पहले कठिन हिस्सा पता लगाना था जो, के कहते हैं, तीन थोड़ा अलग subselects सही एक, था या हम वास्तव में तीन अलग-अलग है, या क्या हम वास्तव में जरूरत की जरूरत है कि क्या मौजूदा तीन से अधिक एक या दो अधिक। (मुझे लगता है कि इस सवाल का जवाब अंत में निकला "ऊपर के सभी" किया जाना है।) संबंधित रिपोर्ट एक ही subselects में से कुछ की जरूरत है; एम 4 + गारंटी देते हैं कि वे वही थे।

दूसरा कठिन हिस्सा परीक्षण डेटा बना रहा था जो दिखा सकता है कि क्वेरी सभी विभिन्न जटिल, जटिल अभियोगी इतिहास के सामने काम कर रही थी। मुझे लगता है कि जो सेलको मुझे कुछ वाणिज्यिक सॉफ्टवेयर बोइंग समय में उपयोग कर रहा था की ओर चलाया - यह कुछ उपयोगकर्ता-निर्धारित मापदंड लिया और और एक परीक्षण दोहन और हर संभव संयोजन या क्रमचय के लिए स्टब्स उत्पन्न।मुझे इसका नाम याद नहीं है।

+0

डरावनी! कहा जाता है कि कुछ ऐसा सवाल है जिसे केवल प्राणघातक शब्दों में सारांशित किया जा सकता है? ;-) –

+0

@underscore_d: एक टिप्पणी में नहीं, लेकिन मैंने जवाब का विस्तार किया। –

+0

क्या कहानी है! अगर मैं कर सकता तो मैं फिर से +1 करूंगा। धन्यवाद! मुझे भविष्य में 'एम 4' और' मेक 'पर विचार करना होगा; मैं कई मामलों पर शर्त लगाता हूं जहां मैंने बैच फ़ाइलों, एसक्यूएल स्क्रिप्ट्स, सी ++ के दोहराव वाले टुकड़े उत्पन्न करने के लिए स्प्रेडशीट टेबल और सूत्रों का उपयोग किया है (जहां इसके अपने मैक्रोज़ बिल बिलकुल फिट नहीं थे), और इसलिए शायद कुछ बेहतर हो सकता है इस तरह से अधिक। फिर भी, यह निश्चित रूप से स्प्रेडशीट्स आईएमओ के एकमात्र वैध उपयोगों में से एक है, हे। –

3

Sendmail कॉन्फ़िगरेशन फ़ाइलों को उत्पन्न करने के लिए एक एम 4-आधारित आधारभूत संरचना प्रदान करता है। अधिकांश प्रेषण स्थापित करता है मैंने इसे कॉन्फ़िगरेशन sendmail की अनुशंसित विधि के रूप में प्रदान करने के साथ काम किया है।

0

मैंने आपके एसक्यूएल टेबल, सी ++ कोड और हेडर को परिभाषित करने के लिए स्वचालित रूप से डीडीएल स्क्रिप्ट उत्पन्न करने के लिए एम 4 का उपयोग किया है, और इसका परीक्षण करने के लिए ड्राइवर। मुझे लगता है कि हमने स्क्रिप्ट को बैकअप में अपडेट किया है और एक ही समय में टेबल को फिर से पॉप्युलेट कर दिया है, लेकिन ऐसा करने के बाद से यह 15+ साल हो गया है।

5

सीएन या सी ++ पार्सर फ़ाइलों को उत्पन्न करने के लिए जीएनयू बायसन आंतरिक रूप से इसका उपयोग करता है।

0

मैंने फ़ाइलों में टोकन को प्रतिस्थापित करने और विभिन्न लक्षित प्लेटफ़ॉर्म के लिए पैकेजिंग फ़ाइलों को उत्पन्न करने के लिए दोनों सीपीपी और एम 4 का उपयोग किया। अब मैं ऐसा करने के लिए रूबी एआरबी का उपयोग करूंगा। और सूरज के दौरान मैंने preprocessing हेडर फ़ाइलों के लिए m4 का उपयोग किया

2

मैंने सी/सी ++ फ़ाइलों को उत्पन्न करने के लिए एम 4 का उपयोग किया है जिसमें संरचना घोषणाओं की सूचियां हैं। संरचना कितनी बदसूरत है और यदि आप इसे सही करते हैं, तो एम 4 फाइलें सी/सी ++ फ़ाइलों की तुलना में पढ़ने और संपादित करना आसान हो सकती हैं।

0

अधिकारी सी ++ के लिए जीटीके +, gtkmm बाध्यकारी पुस्तकालय - एक उत्कृष्ट परियोजना है कि सत्ता में आता है और जीटीके + जीयूआई कभी अधिक आधुनिक सी के माध्यम से ++ सुलभ के तक पहुँचने - आसानी से रैपिंग कोड पैदा करने के लिए अपने टूलसेट के हिस्से के रूप m4 उपयोग करता है।

(मुझे किसी भी जी * प्रोजेक्ट के साथ कोई संबद्धता नहीं है। मुझे बस gtkmm बहुत पसंद है और ऐसा लगता है कि यह विशेष रूप से कुछ स्पष्ट विकल्पों के विपरीत, जैसा भी हो सकता है/नहीं होना चाहिए। इसके अलावा, मुझे नहीं पता था कि m4 था के & आर जब तक मैंने इसके लिए शोध नहीं किया! साफ।)

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