2014-07-11 6 views
5

, मैं वहां a छोड़ देता हूं। जब मैं संकलित करने के लिए चला गया, संकलक सूचना:int int, f() {} संकलित होना चाहिए? एक टाइपो के लिए

missing a ',' between declaration of 'a' and 'f'

कोड:

int a 
f(void) 
{ 
} 

और चूंकि मैं इस तरह किसी भी त्रुटि संदेश कभी नहीं मिल है और मैं नहीं जानता था कि मैं डाल सकता है बहुत surpresing था वहाँ एक अल्पविराम और यह सिर्फ ठीक संकलित (एक से अधिक संकलक मैं परीक्षण किया में):

int a, 
f(void) 
{ 
} 

लेकिन निश्चित रूप से यह मेरा इरादा लेकिन बजाय int f(void){} नहीं था। मैं एक और compilers में आजमाइए लेकिन यह इस तरह काम नहीं किया और सूचना एक सिंटैक्स त्रुटि (बजना में):

error: expected ';' after top level declarator.

मेरे सवाल यह है: जो एक सही है? इसे संकलित करना चाहिए या नहीं करना चाहिए? उस व्यवहार के बारे में मानक क्या कहता है?

मैं इसका उपयोग नहीं कर रहा हूं क्योंकि यह चरम और कार्यों को अल्पविराम से विभाजित करने के लिए थोड़ा बदसूरत है (जैसे यह फ़ंक्शन प्रोटोटाइप के लिए है)। मैं सिर्फ उत्सुक हूँ।

संपादित करें: फ़ंक्शन पैरामीटर में void जोड़ा गया। असल में मैं खाली मानकों के साथ एक समारोह में लिखने के लिए

+2

पूर्व _seems_ मान्य C89 होने के बाद, और बाद वाला अमान्य देखें। सी 99 के लिए, मुझे पूरा यकीन है कि दोनों अमान्य हैं (और जीसीसी '-std = c99 -pedantic' के साथ संकलित करने से इंकार कर देता है)। 'int a, f();' (उत्तरार्द्ध एक फ़ंक्शन घोषणा (परिभाषा के बिना 'int' लौटने वाले तर्कों की अनिर्दिष्ट संख्या लेना) कार्य करता है) हालांकि, वैध सी 99 होगा। आप किस मानक में रूचि रखते हैं? – mafso

+0

जानना अच्छा है, मैं अपनी टिप्पणी हटा दूंगा, क्योंकि वास्तव में इसका मतलब यह नहीं है कि आपके द्वारा किए गए किसी भी काम से अधिक है, लेकिन किसी भी तरह से फिर से पढ़ने में, आपने इसे अधिक स्पष्ट रूप से कहा है। –

+0

ने भी मेरा हटा दिया – Jack

उत्तर

3

कोई यह

संकलन नहीं करना चाहिए चाहता था आप की जरूरत है

int a; 
void f(void) 
{ 
} 

रिक्तियों समय में इस समय सबसे महत्वपूर्ण हिस्सा नहीं हैं। सबसे महत्वपूर्ण हिस्सा यह है कि आपने ए के बाद अर्धविराम नहीं लगाया।

आप int a संकलक int घोषणा के भाग के रूप अगली पंक्तियों में पढ़ने रहता है के बाद अर्धविराम डाल जब नहीं है, इसलिए यह पता नहीं चला है कि आप दो बातें आप चाहते थे, बल्कि तरह एक बहुत अजीब बात थी

int a f() { } 

अल्पविराम जोड़कर, आपने अभी भी इस मुद्दे को ठीक नहीं किया है; क्योंकि एक अल्पविराम एक सूची इंगित करता है पूर्णांकों की एक सूची

int a, b; 

वैध है जबकि

int a, f() { } 

क्योंकि f() { } एक पूर्णांक के लिए मान्य नाम नहीं है नहीं है की घोषणा करने के लिए एक वैध तरीका होगा जो। इस तरह के अक्षर अन्य स्थानों में मान्य हो सकते हैं, लेकिन पिछले a, इसे वहां वैध होने से रोकता है। क्या दो पंक्तियों होना चाहिए था के संयोजन यह मान्य सी

होने से लेकिन अर्धविराम जोड़कर होने से बचाता है, अब आप सी में दो समझदार बातें

int a; 
f() { } 

मैं सुझाव देते हैं कि हर कार्य आप लिखने का रिटर्न वैल्यू है, भले ही यह कुछ भी न करे।

int a; 
void f() { } 

और फिर, यह एक बहुत अच्छा अभ्यास है स्पष्ट रूप से संकेत मिलता है कि समारोह कोई पैरामीटर नहीं ले करता है, तो

int a; 
void f(void) { } 

जो

int a; 
void f(void) 
{ 
} 
+0

क्या यह है 'C89' फ़ंक्शन परिभाषा? –

+0

सी 99 फ़ाइल स्कोप पर एक खाली घोषणा की अनुमति नहीं देता है (जैसा कि आपके दो दूसरे-अंतिम उदाहरणों में, 'f' के फ़ंक्शन बॉडी के समापन'} के बाद '' 'है। और आप _declarations_ के बारे में बात कर रहे हैं, बयान नहीं (फाइल स्कोप पर बयान नहीं हैं)। – mafso

+0

@ फ़िडलिंग बिट्स: 'शून्य एफ() {}' सी 8 9 में सी 8 9 और सी 9 में वैध कार्य परिभाषा है, और सी 11 में। भाषा के सभी तीन संस्करणों में, 'शून्य एफ (शून्य) {} 'को प्राथमिकता दी जाती है। ('शून्य' कीवर्ड और प्रोटोटाइप वाक्यविन्यास सी 8 9 में पेश किए गए थे।) –

4

के बराबर है कि होगा एक वाक्यविन्यास त्रुटि हो। एक समारोह परिभाषा के लिए वाक्य रचना

//  int    f()        {} 
declaration-specifiers declarator declaration-list[opt] compound-statement 

है f() से पहले a, के लिए कोई जगह (मैं एक यादृच्छिक C11 मसौदा पर इस आधारित कर रहा हूँ) नहीं है। C89 के लिए यह समान दिखता है, सिवाय इसके कि declaration-specifiers वैकल्पिक है (अंतर्निहित-int नियम के कारण)।

0

भाषा व्याकरण एक घोषणा के हिस्से के रूप प्रकट करने के लिए एक समारोह परिभाषा के लिए अनुमति नहीं है। क्या आप कर सकते हैं कर लिखने

int a, f(void); 

क्योंकि इस f के लिए केवल एक घोषणा है।


1. है, वहाँ घोषणा से कोई रास्ता हैसमारोह परिभाषा करने के लिए गैर टर्मिनल गैर टर्मिनल; online C standard