2013-07-07 10 views
5

सी ++ (और सी) में हमारे पास #pragma निर्देश है जो मूल रूप से कार्यान्वयन प्रभावों को परिभाषित करता है। हालांकि, निर्देश क्या कर सकते हैं इसकी कोई सीमा है? (ध्यान दें कि मैं क्या मानक की अनुमति देता है, क्या असली compilers वास्तव में के बारे में नहीं के बारे में पूछ रहा हूँ।)मानक #pragma करने की अनुमति देता है?

#pragma ऐसा कर सकते हैं क्या मैं कुछ कर रहा हूँ:

  • कई संकलन एक विकल्प का चयन करने की अनुमति दें जो सभी परिणाम वैध सी ++ में हैं - उदाहरण के लिए, कई उपलब्ध एबीआई में से एक का चयन करें, या कुछ कार्यान्वयन परिभाषित विकल्पों को स्विच करें।

मुझे लगता है कि होगा क्या अनुमति दी है, लेकिन यकीन है कि नहीं कर रहा हूँ:

  • संकलक एक नैदानिक ​​जारी करने के बिना अन्यथा अवैध कोड को स्वीकार करने की अनुमति दें (उदाहरण के लिए, एक संकलक एक नया बनाया समर्थन करने के लिए तय कर सकते हैं -इन प्रकार long long long, लेकिन का उपयोग कर कि एक नैदानिक ​​जारी करने के लिए होता है किसी भी कोड;। इस नैदानिक ​​तो जैसे #pragma long long long साथ दबा दिया जा सकता है

  • संकलक अन्यथा कानूनी कोड को अस्वीकार करने की अनुमति दें, उदाहरण के लिए वहाँ एकहो सकता है 210 जो संकलक को कुछ पुस्तकालय कार्यों और/या भाषा संरचनाओं के उपयोग के रूप में ध्वजांकित करने का कारण बनता है जिसे असुरक्षित माना जाता है।

क्या मैं वास्तव में संदेह की अनुमति दी है, लेकिन यकीन नहीं है या तो:

  • संकलक, कुछ अलग (उदाहरण के लिए करने के लिए कानूनी कोड के शब्दों को बदलने लगता है कि एक संकलक विक्रेता यह माना करने की अनुमति दें एक अच्छा विचार है, तो for हालत (के रूप में do में ... while) एक postcondition थे, और #pragma for postcondion परिभाषित for तदनुसार का अर्थ स्विच करने के लिए।

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

हालांकि, मानक वास्तव में क्या अनुमति देता है? और क्या ऐसी चीजें हैं जिनकी अनुमति है, लेकिन जो ऊपर मेरी सूची द्वारा कवर नहीं हैं?

+0

मुझे संदेह है कि लंबे समय तक लंबी सामग्री की अनुमति होगी: 'प्रज्ञा' को किसी भी तरह से कंपाइलर्स द्वारा अनदेखा किया जा सकता है। –

+0

@Alexandre निश्चित रूप से, लेकिन मैं यह देखने में असफल रहा कि वह किस उदाहरण के लिए एक समस्या है। यदि कंपाइलर 'लंबे समय तक लंबा' समर्थित है, तो यह 'प्रज्ञा' का भी समर्थन करेगा जो इसके उपयोग पर जारी चेतावनी को दबाएगा। इसके अलावा, यह एक और सामान्य चेतावनी दमन प्रज्ञा से अलग कैसे है? –

उत्तर

5

मानक उस पर बहुत स्पष्ट है:

[cpp.pragma] रूप

#pragma pp-tokensopt new-line 

के एक पूर्व प्रसंस्करण निर्देश कार्यान्वयन एक कार्यान्वयन से परिभाषित तरीके से व्यवहार करने का कारण बनता है।व्यवहार विफल होने का अनुवाद कर सकता है या अनुवादक या परिणामी प्रोग्राम को गैर-अनुरूप तरीके से व्यवहार करने का कारण बन सकता है। कार्यान्वयन द्वारा मान्यता प्राप्त कोई भी प्रगति अनदेखा नहीं की जाती है।

इस प्रकार संकलक #pragma को देखने पर जो कुछ भी चाहता है वह कर सकता है।

1

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

+0

आईएमएचओ जीसीसी का पुराना व्यवहार "अन्यथा कानूनी कोड को खारिज कर देगा" के तहत गिर जाएगा (जहां * सभी * कोड खारिज कर दिया गया था, और एक गेम शुरू करना डायग्नोस्टिक जारी करने का एक बहुत ही रचनात्मक तरीका है)। – celtschk

+0

मैंने कुछ भी नहीं लिखा है कि दस्तावेज आवश्यक है, और मैं @celtschk से सहमत हूं कि जो भी आप वर्णन करते हैं उसके खिलाफ है, क्योंकि संकलक को अपरिचित प्रगति को अनदेखा करना चाहिए और आपका विवरण यह है कि यह उनमें से किसी को अनदेखा नहीं करता है। – mah

+0

यदि संकलक * सभी * pragmas के लिए करता है, तो यह तर्कसंगत रूप से उन्हें "पहचानता है"। –

3

सी ++ मानक का n3337 संस्करण का कहना है

रूप #pragma pp-tokensopt new-line के एक पूर्व प्रसंस्करण निर्देश कार्यान्वयन एक कार्यान्वयन से परिभाषित तरीके से व्यवहार करने का कारण बनता है। व्यवहार अनुवाद विफल होने का कारण बन सकता है या अनुवादक या परिणामस्वरूप प्रोग्राम गैर-अनुरूप तरीके से व्यवहार करने का कारण बन सकता है। कार्यान्वयन द्वारा मान्यता प्राप्त कोई भी प्रगति अनदेखा नहीं की जाती है।

मुझे लगता है कि संकलक #pragma के मामले में लगभग कुछ भी करने की अनुमति देता है। दोनों "असफल अनुवाद" और "अनुवादक या परिणामस्वरूप प्रोग्राम गैर-अनुरूप तरीके से व्यवहार करने के लिए" विकल्पों की एक विस्तृत श्रृंखला को शामिल करते हैं।

यह निश्चित रूप से यह नहीं है कि संकलक को "पागल" चीजें करने की अनुमति देने के लिए एक बुद्धिमान बात है - यह लोगों को "परेशान" कर सकती है, लेकिन यह मानक के परिप्रेक्ष्य से पूरी तरह से मान्य है।

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