2014-05-24 10 views
10

मैं समझने के लिए 2 घोषणाओं, f1 और f2, नीचे के बीच अंतर है करना चाहते हैं: f1 में मैं पैरामीटर घोषित प्रकार void() के एक समारोह के लिए एक सूचक हो सकता है, f2 घोषणा f1 से अलग कैसे है ? क्या घोषणा बराबर है? main में मैं दोनों प्रोटोटाइप void() के कार्यों के साथ इनका आह्वान कर सकता हूं। मैं मूल्य/सूचक/संदर्भ से गुज़रने की अवधारणा को समझता हूं, हालांकि ये कार्य हैं और वास्तव में अंतर को समझ नहीं पाते हैं। ऐसा नहीं है कि मैं f1 में पैरामीटर के रूप में पारित फ़ंक्शन को "संशोधित" कर सकता हूं ... धन्यवाद!फ़ंक्शन पैरामीटर बनाम फ़ंक्शन पैरामीटर के लिए सूचक?

पुनश्च: जब अच्छी तरह से ज्ञात सबसे अप्रिय पार्सिंग समस्या में जोड़ने से :)

#include <iostream> 

using namespace std; 

void f1(void (*x)()) 
{ 
    x(); 
} 

void f2(void x()) 
{ 
    x(); 
} 

void g1() 
{ 
    cout << "Invoking f1(g1())" << endl; 
} 

void g2() 
{ 
    cout << "Invoking f2(g2())" << endl; 
} 


int main() 
{ 
    f1(g1); 
    f2(g2); 
} 

इस सवाल से आया कार्यक्रम संकलित करता है तथा उत्पादन

Invoking f1(g1()) 
Invoking f2(g2()) 
+0

धन्यवाद सब, इसे मिला :) – vsoftco

उत्तर

7

वे बराबर हो रहा है। आप निहित सूचक रूपांतरण द्वारा भ्रमित हो रहे हैं जो तर्कों के साथ होता है।

चूंकि आप किसी फ़ंक्शन को तर्क के रूप में फ़ंक्शन नहीं दे सकते हैं (आप उन्हें कॉल करने या उनके पते को लेने के अलावा अन्य में फ़ंक्शंस के साथ कुछ भी नहीं कर सकते हैं), संकलक चुपचाप तर्क को पॉइंटर में बदल देता है समारोह।

यह एरे के साथ होता है जैसा ही होता है - आप एरे को फ़ंक्शन तर्क के रूप में पास नहीं कर सकते हैं, इसलिए जब भी आप एक सरणी के रूप में फ़ंक्शन तर्क घोषित करते हैं, तो यह चुपचाप एक सूचक में बदल जाता है।

+0

ठीक है, धन्यवाद, पता था कि एरे के साथ क्या हो रहा था, हालांकि फ़ंक्शन सामग्री के बारे में नहीं पता था। बहुत धन्यवाद, आपका जवाब स्वीकार करेगा क्योंकि यह मामूली तेजी से था :) – vsoftco

2

वे एक ही चीज़ के लिए वैकल्पिक वाक्यविन्यास हैं। दोनों मामलों में एक फ़ंक्शन पॉइंटर पास हो जाता है, लेकिन आपको पैरामीटर सूची में गैर-पॉइंटर सिंटैक्स का उपयोग करने की अनुमति है। फंक्शन नाम का उपयोग हमेशा काम करने के लिए एक सूचक के लिए decays (और यह पुनरावर्ती हो सकता है)।

13

सी और सी ++ दोनों में, यदि आप फ़ंक्शन प्रकार के लिए फ़ंक्शन पैरामीटर घोषित करते हैं, तो इसका प्रकार फ़ंक्शन पॉइंटर में समायोजित किया जाएगा।

C99, §6.7.5.3/8

के रूप में एक पैरामीटर का एक घोषणा '' 'प्रकार लौटने समारोह' 6.3 के रूप में, '' समारोह लौटने प्रकार के सूचक 'को' समायोजित किया जाएगा। 2.1।

सी ++ 11, §8.3.5/5

... के बाद प्रत्येक पैरामीटर के प्रकार, प्रकार के किसी भी पैरामीटर "टी की सरणी" या "समारोह लौटने टी" का निर्धारण क्रमशः "टी करने के लिए सूचक" या "लौटने टी कार्य करने के लिए सूचक," हो सकता है करने के लिए समायोजित ...

इस प्रकार, C++, उदाहरण के लिए, हम f1 और f2void(void(*)()) के रूप में दोनों के प्रकार लिख सकते हैं।

+0

मानक से महत्वपूर्ण पैराग्राफ को इंगित करने के लिए धन्यवाद! – vsoftco

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