2016-12-26 13 views
5

मैं सी ++ फ़ंक्शन पॉइंटर सिंटैक्स को समझने की कोशिश कर रहा हूं। ग्रहण में लिनक्स पर जब मैं टाइप किया:क्या सी ++ में शून्य (*) का मतलब कुछ भी है?

void(*); 

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

std::vector<void(*)> myVector; 

यह विजुअल स्टूडियो पर ठीक संकलित करता है। कुछ ऑनलाइन कंपाइलर्स शून्य (*) पर भी; अपने काम पर ठीक है। मुझे पता है कि:

void (*)(); 

... एक समारोह सूचक है और ..

void(); 

... एक समारोह हस्ताक्षर है, जो तुम क्यों कर सकते हैं:

std::function<void()> func; 

मुझे फ़ंक्शन पॉइंटर सिंटैक्स को समझने में बहुत परेशानी हो रही है।

धन्यवाद।

+0

क्या कंपाइलर 'शून्य (*) स्वीकार करता है;'? –

+0

यह एक: https://ideone.com/lEeMY3, और http://www.cpp.sh/ लेकिन यह एक http://codepad.org/Zl1UQRa3 नहीं है। विजुअल स्टूडियो इसे std :: वेक्टर घोषणा/परिभाषा में स्वीकार करेगा। जीसीसी के साथ ग्रहण में आश्चर्यजनक रूप से यह एक त्रुटि के रूप में हाइलाइट करता है लेकिन अभी भी संकलित करता है और चलता है। – Zebrafish

+0

यह एक कंपाइलर बग या भाषा एक्सटेंशन, या संयोजन की तरह लगता है। मेरा सुझाव है कि आप '+pedantic-error' ध्वज के साथ और बिना g ++ को आज़माएं। विचार के साथ 'int (**);' संकलित, लेकिन उदा। 'int; 'या, विशेष रूप से,' int **; ', संकलित नहीं करता है। –

उत्तर

12

याद रखें कि कुछ चीजों की प्राथमिकता को बदलने के लिए ब्रांड्स का उपयोग किया जा सकता है। यही कारण है कि आपके पास void (*)() में तारांकन के चारों ओर कोष्ठक हैं क्योंकि यह void *() से बहुत अलग है।

void(*) के मामले में ब्रांड्स इस तरह के प्राथमिकता-बदलते कोष्ठक हैं। लेकिन उनकी जरूरत नहीं है। प्रकार void(*)void*, सादा और सरल है।

संदर्भ जहां आप इसका उपयोग करते हैं, यह महत्वपूर्ण है।

+0

यह दिलचस्प है, क्योंकि अगर ब्रांड्स केवल एक प्राथमिकता है और इसका मतलब यह है कि, यह अजीब बात है कि मैंने दो ऑनलाइन कंपाइलर्स पर कोशिश की, अगर मैं कोष्ठक बंद करता हूं तो यह संकलित नहीं होगा। – Zebrafish

+0

यह परिकल्पना (उस समय का जवाब जब मैं इसे लिख रहा हूं) इस तथ्य से मेल नहीं खाता है कि आइडिया 'शून्य (*);' संकलित करता है लेकिन 'शून्य *; 'नहीं। जहां तक ​​यह जाता है ठीक है लेकिन यह कोई स्पष्टीकरण प्रदान नहीं करता है। –

+0

@ चीयर्संधथ.-अल्फ वह हिस्सा सिर्फ एक कंपाइलर बग है। –

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