2010-12-13 13 views
5

मुझे समझ में नहीं आ रहा है कि नीचे दी गई घोषणा क्यों स्वीकार की जाती है:फ़ंक्शन पॉइंटर घोषणा में ब्रांड्स महत्वपूर्ण क्यों हैं?

typedef void (*_tStandardDeclaration)(LPVOID); 

जबकि निम्न नहीं है:

typedef void *_tDeclarationWithoutParenthesis(LPVOID); 
typedef void* _tAlternateDeclaration(LPVOID); 

मैं एमएसवीसी 6 का उपयोग कर रहा हूं (मुझे पता है कि यह अप्रचलित और गैर-मानक है, लेकिन यह है एक वार्षिक दसवीं मिलियन राजस्व प्रणाली को बनाए रखने के लिए आवश्यक: /)

+4

सूचना है कि उन सभी typedef घोषणाओं मान्य हैं। कोई भी अमान्य C++ नहीं है। –

उत्तर

11

पॉइंटर प्रतीक डिफ़ॉल्ट रूप से प्रकार से बांधता है, इसलिए फ़ंक्शन पॉइंटर को यह इंगित करने के लिए कोष्ठक की आवश्यकता होती है कि सूचक वास्तव में नाम पर है और वापसी पर नहीं टी ype।

5

ब्रांड्स के बिना, आप एक void* लौटने वाला फ़ंक्शन घोषित कर रहे हैं, void पर वापस आने वाले फ़ंक्शन के सूचक नहीं।

3

कोड नीचे X 10.6.5 संकलक उधम मचाते करने के लिए सेट के साथ MacOS पर जीसीसी 4.2.1 द्वारा एक वीटर के बिना स्वीकार किया जाता है:

c++ -Wall -Wextra -c xx.cpp 

कोड:

typedef void *LPVOID; 

typedef void (*_tStandardDeclaration)(LPVOID); 

typedef void *_tDeclarationWithoutParenthesis(LPVOID); 
typedef void* _tAlternateDeclaration(LPVOID); 

पहले देता है एक void लौटने वाले फ़ंक्शन के लिए सूचक; बाद वाले दो बराबर हैं (रिक्ति कोई फर्क नहीं पड़ता) और आपको एक प्रकार का काम देता है जो 'कार्य (एलपीवीओआईडी तर्क ले रहा है) जो शून्य को पॉइंटर देता है।

आप समारोह संकेत घोषित करने के लिए उन्हें इस्तेमाल कर सकते हैं:

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer; 

मज़ा, ऐसा नहीं है ...

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