एक फ़ंक्शन नाम के आसपास कोष्ठक का क्या अर्थ है?


214

मेरे प्रोजेक्ट स्रोत फ़ाइलों में से एक में, मुझे यह C फ़ंक्शन परिभाषा मिली:

int (foo) (int *bar)
{
    return foo (bar);
}

नोट: इसके आगे कोई तारांकन नहीं है foo, इसलिए यह फ़ंक्शन पॉइंटर नहीं है। या यह है? पुनरावर्ती कॉल के साथ यहां क्या हो रहा है?


7
नहीं, यह एक फ़ंक्शन पॉइंटर नहीं है - यह अभी भी एक नियमित फ़ंक्शन है जिसका नाम फू है।
नेमंजा बोरीक

क्या यह पूरा कार्य है?
अश्लेषा

2
क्या आपके पास सबूत है कि इस फ़ंक्शन का उपयोग एक उपयोगी संदर्भ में किया गया है?
मूओइपाइप

1
... कुछ डमी फ़ंक्शन की तरह दिखता है जो शायद यह देखने के लिए लिखा गया था कि क्या यह संकलित है, मौजूदा स्रोत में, और इसे हटा दिया जाना चाहिए था। मैं इसे हटा देता हूं (यदि ऐसा है जो वास्तव में कार्य करता है), तो सबसे अच्छा यह अनंत लूप होगा (मुझे यकीन नहीं है कि सी कंपाइलर को उस टेल कॉल को कूदने के लिए ऑप्टिमाइज़ करने की अनुमति है), सबसे खराब स्टैक ओवरफ्लो पर।
हाइड

3
C घोषणाओं में कोष्ठक भाषा को अस्पष्ट बनाने में मदद करते हैं। जल्दी, क्या है a(b);? bप्रकार के एक चर के रूप में घोषणा a? या aतर्क के साथ काम करने के लिए एक कॉल b? अंतर सिंटैक्टिक है, और आप यह नहीं जान सकते हैं कि घोषणा की जानकारी को देखे बिना इसे पार्स करने का कौन सा तरीका है a; यानी उन पोस्टफिक्स फ़ंक्शन कॉल को एक घोषणाकर्ता के आसपास कोष्ठक या वैकल्पिक कोष्ठक कहते हैं।
काज़

जवाबों:


329

किसी भी प्रीप्रोसेसर सामान के अभाव में, fooहस्ताक्षर के बराबर है

int foo (int *bar)

एकमात्र संदर्भ जिसमें मैंने लोगों को फ़ंक्शन नामों के आसपास अनावश्यक रूप से कोष्ठक डालते हुए देखा है, जब एक ही नाम के साथ एक फ़ंक्शन और फ़ंक्शन जैसे मैक्रो दोनों हैं, और प्रोग्रामर मैक्रो के विस्तार को रोकना चाहता है।

यह अभ्यास पहली बार में थोड़ा अजीब लग सकता है, लेकिन सी लाइब्रेरी कुछ मैक्रोज़ और समान नामों के साथ फ़ंक्शन प्रदान करके एक मिसाल कायम करती है ।

ऐसा ही एक फंक्शन / मैक्रो पेयर है isdigit()। पुस्तकालय इसे इस प्रकार परिभाषित कर सकता है:

/* the macro */
#define isdigit(c) ...

/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
  return isdigit(c); /* use the macro */
}

आपका कार्य उपरोक्त के समान है, इसलिए मुझे संदेह है कि आपके कोड में भी यही चल रहा है।


2
यहाँ भी ऐसा हो सकता है; मैंने मैक्रोज़ की तलाश नहीं की ... और मुझे नहीं पता था कि कोष्ठक के भीतर स्थूल विस्तार नहीं होता है, इस ओर इशारा करने के लिए धन्यवाद!
उपयोगकर्ता 1859094

13
@ user1859094: दूसरी नज़र में, यह लगभग निश्चित रूप से आपके कोड में क्या चल रहा है। foo(bar)समारोह के अंदर इसी मैक्रो का उपयोग कर रहा है।
एनपीई

78
@ user1859094 मैक्रो का विस्तार कोष्ठक के भीतर होता है, लेकिन फ़ंक्शन-जैसे मैक्रो का विस्तार केवल तभी होता है यदि अगला टोकन एक बाएं कोष्ठक (C99, 6.10.3§10) है, इस प्रकार foo (int* bar)प्रतिस्थापित हो जाएगा, लेकिन नहीं (foo) (int *bar)(अगला टोकन के बाद fooहै ))
वर्जिल

4
ऐसे समारोह को कैसे कहा जाएगा? क्या आप इसे कोष्ठक के साथ भी कहेंगे? उदाहरण के लिए, क्या यह काम करेगा (isdigit)(5):?
gocochard

4
@Greg: ठीक है, यह ठीक है कि आप इसे कैसे कहेंगे।
एनपीई

37

परांठे घोषणा में बदलाव नहीं करते हैं - यह अभी भी केवल एक साधारण फ़ंक्शन को परिभाषित कर रहा है जिसे कहा जाता है foo

कारण है कि वे इस्तेमाल किया गया है लगभग निश्चित रूप से है क्योंकि वहाँ एक समारोह की तरह मैक्रो fooपरिभाषित कहा जाता है:

#define foo(x) ...

(foo)फ़ंक्शन घोषणा में उपयोग करने से यह मैक्रो को यहां विस्तारित होने से रोकता है। तो क्या होने की संभावना है कि एक फ़ंक्शन foo()को फ़ंक्शन-जैसे मैक्रो से विस्तारित किया जा रहा है foo


5
अच्छा कटौती (हालांकि इस उद्देश्य के लिए कोष्ठक का उपयोग करना कानून द्वारा दंडनीय होना चाहिए)।
8

3
@ युगीन: फ़ंक्शन नाम के चारों ओर परेंस का उपयोग फ़ंक्शन-जैसे मैक्रो के लिए स्थूल विस्तार को रोकने का एकमात्र तरीका है। कई बार यह एक आवश्यक उपकरण है।
माइकल बूर

7
@MichaelBurr, एक ही नाम के साथ मैक्रो और फ़ंक्शन नहीं होने का विकल्प भी है। मुझे पता है कि आप हमेशा सब कुछ नियंत्रित नहीं कर सकते हैं, लेकिन अगर आप इस समाधान तक पहुंच गए हैं, तो मैं कहूंगा कि कुछ बहुत गलत है।
ugoren

-3

कोष्ठक व्यर्थ हैं।
आपके द्वारा दिखाया गया कोड अनंत पुनरावृत्ति के अलावा और कुछ नहीं है।

एक फ़ंक्शन पॉइंटर को परिभाषित करते समय, आप कभी-कभी अजीब कोष्ठक देखते हैं जो कुछ मतलब रखते हैं। लेकिन यहाँ ऐसा नहीं है।


6
जाहिर तौर पर नहीं; कोष्ठक स्थूल विस्तार को रोकते हैं। स्वीकृत उत्तर देखें।
केविन

12
@ क्विन, मेरा उत्तर दिखाए गए कोड के बारे में है, और इसके लिए सही है। यहां लगभग किसी भी सी प्रश्न में, अज्ञात प्रीप्रोसेसर परिभाषाओं को मानते हुए सब कुछ बदल सकता है। इस मामले में, प्रीप्रोसेसर पर विचार करने वाले उत्तर वास्तव में बेहतर हैं, लेकिन यह मेरा गलत नहीं है।
ugoren
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.