2015-03-08 14 views
7

बिना सी/सी ++ फ़ंक्शन मैक्रोज़ का विस्तार करें सी/सी ++ फ़ाइल में, सभी फ़ंक्शन मैक्रोज़ को प्रीप्रोसेसर के माध्यम से चलाने के बिना, मैं सभी फ़ंक्शन मैक्रोज़ का परीक्षण/विस्तार कैसे करूं?प्रीप्रोसेसर

#include <iostream> 
#define AAA(a) cout << "function " << a << endl 
using namespace std; 
int main(){ 
AAA(12); 
} 
इस में

: उदाहरण के लिए, वहाँ एक प्रोग्राम या विधि है जो इस बदलना चाहते हैं?

#include <iostream> 
using namespace std; 
int main(){ 
cout << "function " << 12 << endl; 
} 

मैं क्योंकि सभी फाइलों में शामिल पूर्वप्रक्रमक के माध्यम से चलाने के लिए नहीं करना चाहती "जीसीसी -E <>" बनाने के उत्पादन वास्तव में बदसूरत, मैं सिर्फ सभी भूमि के ऊपर के बिना एक जोड़े को सरल मैक्रो विस्तार चाहते हैं।

+3

आप शायद कुछ कोड लिख सकते हैं जो लाइब्रेरी के रूप में क्लैंग का उपयोग करते हैं, और इसका प्रीप्रोसेसर का उपयोग करते हैं। जब तक 'grep -v^\ # में myfile शामिल नहीं है | gcc -E' आपके लिए पर्याप्त है। –

+0

सी ++ के लिए रिशेर्पर आपको ऐसा करने देता है। – chris

+0

सुझाव मैट के लिए धन्यवाद, मैं क्लैंग में देखूंगा। हालांकि, यह कोड की 33k + लाइनों से अधिक हो जाएगा, इसलिए मुझे लगता है कि grep थोड़ा गंदा हो जाएगा। मैं अभी एक मैक पर हूं लेकिन मैं एक वीएम पर हॉप करूंगा और रिशेर्पर को एक शॉट भी दूंगा। – Involution

उत्तर

-1

मान लीजिए कि आप file.c. देखना चाहते हैं। यदि इसमें फ़ंक्शन मुख्य है, तो इसके लिए आपको उस फ़ंक्शन का नाम बदलने के लिए बदलना होगा। निम्नलिखित फ़ाइल को stdout करने के लिए प्रिंट करता है, केवल मध्यम जोड़ा कुरूपता के साथ।

#include "file.c" 
#include <stdio.h> 

#define X(...) #__VA_ARGS__ 

void print_file(char* s) 
{ 
    // a loop here to move through s until some identifier is found 
    // in the original file, say a comment that says: //___START___HERE___ 
    while(*s){ 
     if(*s=='{' | *s=='}' | *s=='#') printf("\n"); 
     printf("%c",*s); 
     if(*s==';') printf("\n"); 
     } 
} 

int main(int argc, char* argv[]) 
{ 
    print_file(X(
    #include "file.c" 
    )); 
    return 0; 
} 
+0

यह फाइल में सभी शामिल प्रिंट करेगा। – Puppy

+0

@Puppy, यह वास्तव में मामूली मुद्दा है। आप तब तक प्रिंट नहीं करते जब तक आप मुख्य नाम बदल नहीं पाते हैं, या कुछ सेट टिप्पणी, या कुछ। अतिरिक्त कोड की 2 लाइनों की तरह Thats। – Kyle

+0

सही ढंग से पार्सिंग सी ++ कोड तुच्छ से बहुत दूर है। – Puppy

2

नहीं, यह संभव नहीं है। आपके शामिल हेडर में मैक्रोज़ शामिल हो सकते हैं जिन्हें आप शरीर में विस्तार करना चाहते हैं, उदाहरण के लिए। या क्या आप हेडर से आने वाले किसी भी मैक्रोज़ का विस्तार नहीं करना चाहते थे? प्रीप्रोसेसर के पास इस मामले में जो चाहते हैं उससे आप जो चाहते हैं उसे अलग करने का बिल्कुल कोई तरीका नहीं है।

यदि आप पहले से जानते हैं तो यह मामला नहीं है, तो मैं शामिल करने के लिए बस एक स्क्रिप्ट लिखने की सलाह देता हूं और फिर प्रीप्रोसेसर के माध्यम से चलाता हूं।

1

मैं विषय पर सभी संभावित नकारात्मक जवाब सुना:

  • मैक्रो केवल मूल्यांकन नहीं
  • प्रोसेसर भी पार्स चाहिए फ़ाइलों को शामिल
  • नेस्टेड मैक्रो ओवर-द जटिल
  • सशर्त हो सकता है विस्तारित किया जा सकता preprocessing मुश्किल हो सकता है
  • मैक्रोज़ बुराई हैं केवल उनसे बचें
  • आदि आदि ....

वे सभी सच हैं, लेकिन आईएमओ वे हर दिन प्रोग्रामिंग की वास्तविकता के साथ टकराते हैं।

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

यह कैसे करें?

1 Onl, inux बस GDB और उसके विस्तार मैक्रो क्षमताओं का उपयोग 2 खिड़कियां मैं https://www.jetbrains.com/resharper-cpp/ दृश्य स्टूडियो में एकीकृत का उपयोग पर

तो, हाँ, एक व्यावहारिक अर्थ में, यह संभव है।

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