2011-10-26 14 views
13

द्वारा सरणी तर्क पास करना मैं इस हस्ताक्षर के साथ एक समारोह में आया था।संदर्भ

void foo(char (&x)[5]) 
{ 
} 

इस संदर्भ द्वारा एक निश्चित आकार चार सरणी पारित करने के लिए वाक्य रचना है।

तथ्य यह है कि इसे के आसपास कोष्ठक की आवश्यकता है, जो मुझे असामान्य मानता है।

यह शायद सी ++ 03 मानक का हिस्सा है।

इस फ़ॉर्म को क्या कहा जाता है और क्या कोई मानक के संदर्भ को इंगित कर सकता है?

$ c++decl 
Type `help' or `?' for help 
c++decl> explain void foo(char (&x)[5]) 
syntax error 
+3

मैं मानक को इंगित नहीं कर सकता, लेकिन मेरा मानना ​​है कि यह इसलिए है क्योंकि 'char & x [5] '5 वर्ण संदर्भों की एक सरणी है, लंबाई 5 की वर्ण सरणी के संदर्भ में नहीं। –

+0

' C++ decl' आपका मित्र है :-) –

+1

8.3.2 संदर्भ "संदर्भों के संदर्भ, संदर्भों का कोई सार नहीं, और संदर्भों के लिए कोई संकेत नहीं होगा।" –

उत्तर

11

वाक्यविन्यास के बारे में असामान्य या नया कुछ भी नहीं है। आप इसे सी में पॉइंटर्स के साथ हर समय देखते हैं। []& से अधिक प्राथमिकता है, इसलिए यदि आप किसी सरणी के संदर्भ को घोषित करना चाहते हैं तो आपको इसे कोष्ठक में रखना होगा। * (जो & के समान वही प्राथमिकता है) के साथ एक ही बात होती है: उदाहरण के लिए, सी में 5 वर्णों की सरणी में पॉइंटर घोषित करने के लिए, आप char (*x)[5]; करेंगे। इसी प्रकार, एक फंक्शन के लिए एक सूचक जो एक int लेता है और देता है int (*x)(int); (()[] के समान प्राथमिकता है)। कहानी संदर्भों के साथ समान है, सिवाय इसके कि संदर्भ केवल सी ++ पर हैं और संदर्भों से किस प्रकार के गठन किए जा सकते हैं इसके कुछ प्रतिबंध हैं।

+0

+1 कोष्ठक की आवश्यकता को समझाने के लिए। प्रलेखित संदर्भों से प्रकार बनाने पर प्रतिबंध कहां हैं? –

+0

@ एडी Pronk: मैं ऊपर दिए गए आपके प्रश्न पर आपकी टिप्पणी में उद्धृत बयान का जिक्र कर रहा था – newacct

11

समझाने के लिए कुछ भी नहीं है, यह बस कैसे घोषणाओं के लिए पार्स नियम सी में काम ++ है:

char & x[5] // declare x as array 5 of reference to char (not valid C++!) 
char (&x)[5] // declare x as reference to array 5 of char 

सावधानी:

C++ डीईसीएल अभी तक एक दोस्त नहीं है पहला संस्करण वैध सी ++ मान्य नहीं है, हालांकि, आपके पास संदर्भों के सरणी नहीं हो सकते हैं। यह केवल घोषणा वाक्यविन्यास का एक स्पष्टीकरण है। (इस अधिकार को पाने के लिए बहुत लंबा समय लेने के बारे में खेद है, और उपयोगी टिप्पणियों के लिए धन्यवाद!)

यदि आपको पसंद है तो आपको कोष्ठक के आर्बिट्रे स्तरों में टाइप पहचानकर्ता को लपेटने की अनुमति है, ताकि आप char &(x)[5] (पहला मामला भी कह सकें) या char (((&x)))[5] (दूसरा मामला)।

+0

+1: यह सही है।) –

+0

कौन सा कंपाइलर पहला फॉर्म स्वीकार करता है? जीसीसी 4.4।5 नहीं करता है: त्रुटि: संदर्भों की सरणी के रूप में 'x' की घोषणा –

+0

बेशक, कि पहले कानूनी सी ++ नहीं है, क्योंकि आपको संदर्भों के सरणी रखने की अनुमति नहीं है। –

0

c++decl ज्यादातर इसके लिए काम करता है। यह आप जो कुछ देते हैं उसके बारे में यह थोड़ा सा पसंद है।

c++decl> explain void foo(char (&)[5]) 
declare foo as function (reference to array 5 of char) returning void 

c++decl> explain void foo(char &[5]) 
declare foo as function (array 5 of reference to char) returning void 

जैसा कि एक अन्य उत्तर में बताया गया है, संदर्भों की एक श्रृंखला अवैध है। GNU सी ++ संकलक रिपोर्ट:

error: declaration of ‘x’ as array of references

वैसे, here कि cdecl में कार्य करता है (हालांकि यह संदर्भ के बारे में शिकायत क्योंकि संस्करण साइट द्वारा होस्ट किए गए सी-विशिष्ट है) एक ऑनलाइन उपयोगिता के लिए एक कड़ी है।

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