2012-03-09 23 views
5

मैं एक प्रदर्शन संवेदनशील CUDA कोड है, जो मैंकैसे Emacs ठीक से संभाल सी प्रीप्रोसेसर सशर्त,

#ifdef DEBUG_<NAME_OF_SECTION> 
    ... 
#else 
    ... 
#endif 

... सशर्त उपयोग कर रहा हूँ गति-गंभीर डिबगिंग कोड है, जो अतिरिक्त जानकारी पकड़ लेता है बंद संपुटित करने के लिए है जीपीयू

सब कुछ Emacs (Centos 6.0) ऊपर #else तक में अच्छी तरह से चला जाता है।

(1 टैब से) यह deindents पूर्वप्रक्रमक सशर्त के बाकी खंड के अंदर का पाठ और बाद में सब कुछ deindent जारी है।

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ नोट: ) पूर्वप्रक्रमक सशर्त, अंदर प्रतिकृति हो रहा है सी-मोड द्वारा ठीक से संभाला गया। लेकिन ); डुप्लिकेशंस चीजों को तोड़ता है, जिससे आप सशर्त के बाहर ); स्थानांतरित कर सकते हैं ... ओह प्रिय कितना असंगत है। मैं इस प्रश्न को तब तक खुला रख रहा हूं जब तक कि हम इस असंगतता को ठीक करने के लिए उचित elisp कोड प्राप्त न करें। ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ वर्तमान जवाब पर

नोट:
Jens प्रदान की गई है सशर्त के अंदर नेस्टेड ) इंडेंटिंग का दावा करने में गलत जानकारी "असंभव" है। यह केवल संभव नहीं है, लेकिन Emacs 'C-Mode सक्रिय रूप से ऐसा करता है। इस सबूत के लिए इस प्रश्न पोस्ट के अंत में उदाहरण सी प्रोग्राम के उचित इंडेंटेशन पर ध्यान दें। तो यह कारण है कि ); भी इंडेंट करने के लिए संभव है, हालांकि सावधानी Jens द्वारा उल्लिखित कारणों के लिए प्रयोग किया जाना चाहिए खड़े हैं।

किसी भी तरह, मैं यह सुनिश्चित करना चाहता हूं कि लोग देखें कि कथन गलत है, इसलिए उन्हें नहीं लगता कि यह प्रश्न असंभव है। मैं इस टिप्पणी और जेन्स 'पोस्ट पर मेरी downvote जब वह अपने गलत बयान हरजाना प्रतिबिंबित करने के लिए है कि यह संभव है, ) के बहुत मामले वह रूपरेखा के लिए C-मोड में कार्यान्वित किया जाता है निकल जाएगी, लेकिन अनुशंसित नहीं है।

वर्तमान में मैं चीजों को मैन्युअल रूप से एक टैब को आगे बढ़ाने का प्रयास कर रहा हूं, लेकिन यह बहुत समय बर्बाद कर रहा है (कोड लंबा है)।

किसी भी विचार क्या मैं इसे ठीक करने के लिए अपने ~/.emacs फाइल करने के लिए जोड़ सकते हैं ???

अग्रिम धन्यवाद!

संपादित करें 1 मुझे यह उल्लेख करना चाहिए कि जिस क्लॉज पर लग रहा है वह एक कार्य बंद है, उदाहरण के लिए

 MyFunc<<<Blk,Thr>>>(Stuff1, 
    #ifdef DEBUG_FUNC1 
          Stuff2, 
          dev_Debug); 
    #else 
         Stuff2); //Deindents here. 
    #endif 
    //Everything here on out is deindented. 

यह कोड संरचना उस तरह पर एक विशिष्ट विफलता हो सकता है ...

संपादित 2 यहाँ एक बस सी कोड संस्करण है ... कोड अपेक्षित ढंग से काम करता है, लेकिन नहीं deindent पिछले #else खंड ...

#include <stdio.h> 

//#define DEBUG 

void printer 
(int A, 
#ifdef DEBUG 
int B, 
int C) 
#else 
int B) 
#endif 
{ 
#ifdef DEBUG 
    printf("A: %i, B: %i, C: %i\n", A, B, C); 
#else 
    printf("A: %i, B: %i\n", A, B); 
#endif 
} 

int main() 
{ 
    int A = -3; 
    int B = 1; 
    int C = 3; 
    printer(A, 
#ifdef DEBUG 
     B, 
     C); 
#else 
    B); 
#endif 
    return 0; 
} 

पर ... कि मैं क्या कर रहा हूं की तर्ज पर है।मुझे पता है कि यह सी में वाक्य रचनात्मक रूप से काम करता है (या कम से कम मुझे लगता है ... यह सही परिणाम देता है), हालांकि Emacs को उस कॉल कॉल के अंदर #else क्लॉज पसंद नहीं है ....

+0

यदि आप '# ifdef' और' # else' के बीच कोड में खोलने और बंद करने वाले ब्रेसिज़ ('{}') की संख्या की गणना करते हैं, तो क्या वे सभी मेल खाते हैं? –

+0

उदाहरण देखें ... प्रीप्रोसेसर सेक्शन में कोई '{}' नहीं है ... ऐसा लगता है कि फ़ंक्शन कॉल के भीतर प्रीप्रोसेसर का उपयोग करना मेरे जैसा नहीं है। एक गैर-सीयूडीए उदाहरण पोस्ट करें ताकि मैं दिखा सकूं कि मेरा क्या मतलब है ... –

+1

प्रत्येक शाखा में अधिक डालने पर विचार करें (उदा। यदि डुप्लिकेट परिभाषा आवश्यक हो)। मुझे संदेह है कि यह पहले पथ में ")" के कारण है। –

उत्तर

3

मुझे लगता है कि समस्या है अपने कोड के तर्क में। तार्किक रूप से आपके पास फ़ंक्शन पैरामीटर सूची में अलग-अलग पैरामीटर हैं। समापन कोष्ठक सशर्त का हिस्सा नहीं होना चाहिए।

MyFunc<<<Blk,Thr>>>(
         Stuff1, 
#ifdef DEBUG_FUNC1 
         Stuff2, 
         dev_Debug 
#else 
         Stuff2 
#endif 
        ); 

या वैकल्पिक रूप से आपके प्रोटोटाइप के दो पूर्ण संस्करण होना चाहिए जो आपके डीबग मैक्रो के अनुसार चुने गए हैं। बाकी सब कुछ केवल emacs (या शायद किसी अन्य संपादक) के लिए पार्स करना मुश्किल नहीं है बल्कि आपके बाद आने वाले गरीब इंसान के लिए भी मुश्किल है।

#if A 
(
#endif 
something 
#if B 
) 
#endif 

जहां A और B सभी वैध संकलन के लिए ही कर रहे हैं: के बाद से एक कोड की खरोज स्तर मैक्रो पर निर्भर कर सकते

तुम क्या चाहते संभव नहीं है। Emacs A और B के लिए मूल्य मानने के बिना नहीं जान सकते हैं, इंडेंट कैसे करें।

+0

मेरा कोड वाक्य रचनात्मक रूप से सही और संकलित है ... यह खराब रूप हो सकता है, लेकिन मैं प्रत्येक बंद तर्क-सेट पर ''); टोपी शामिल करता हूं। इसे कोडिंग मानकों के बारे में बहस में बदलने के बिना, अगर यह वाक्य रचनात्मक रूप से सही है तो इसे क्यों नहीं हटाया जा सकता है। –

+0

उपरोक्त सरल सी उदाहरण देखें यदि आप मुझे सिंटैक्स काम करने के बारे में विश्वास नहीं करते हैं। अब, आपका समाधान काम करता है, लेकिन मैं जवाब देने का प्रयास करना चाहता हूं कि क्यों emacs सी हैंडलर मेरे विकल्प को बुझाता है, लेकिन वैध वाक्यविन्यास और इसे कैसे रोकें ... जब तक मुझे यह जवाब न मिल जाए तो यह प्रश्न खुला रहता है सिद्धांत, लेकिन मैं आपको रेटिंग कर रहा हूं क्योंकि मैं आपके समाधान का उपयोग काम के आसपास के रूप में कर रहा हूं। ;) –

+0

@ जेसन, क्योंकि elisp lisp है। इसका पार्सर समापन संश्लेषण (व्यापक रूप से) के लिए स्कैनिंग पर गहराई से निर्भर है। सी अलग है, यह चरण में कोड को पार करता है और पाठ के कुछ हिस्सों को संकुचित रूप से बदलता है (या हटा देता है)। किसी भी तरह से आप प्रीप्रोसेसर मैक्रोज़ के किसी भी संभावित मूल्य के लिए कोड की पहचान करना चाहते हैं। दिए गए ब्लॉब के लिए, इस बात की कोई गारंटी नहीं है कि इंडेंटेशन ने गणना की है कि इस तरह से कुछ अद्वितीय भी है। –

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