जीसीसी प्रकार की बाहरी घोषणाओं की अनुमति क्यों देता है? क्या यह एक एक्सटेंशन है या मानक सी है? क्या इसके लिए स्वीकार्य उपयोग हैं?जीसीसी प्रकार शून्य (गैर-सूचक) की बाहरी घोषणाओं की अनुमति क्यों देता है?
मैं इसे एक विस्तार है अनुमान लगा रहा हूँ, लेकिन मैं भी नहीं मिलता है उस पर उल्लेख किया:
http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/C-Extensions.html
$ cat extern_void.c
extern void foo; /* ok in gcc 4.3, not ok in Visual Studio 2008 */
void* get_foo_ptr(void) { return &foo; }
$ gcc -c extern_void.C# no compile error
$ gcc --version | head -n 1
gcc (Debian 4.3.2-1.1) 4.3.2
foo परिभाषित के रूप में प्रकार शून्य निश्चित रूप से एक संकलन त्रुटि है:
$ gcc -c -Dextern= extern_void.c
extern_void.c:1: error: storage size of ‘foo’ isn’t known
तुलना के लिए, विजुअल स्टूडियो 2008 बाहरी घोषणा पर एक त्रुटि देता है:
$ cl /c extern_void.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
extern_void.c
extern_void.c(1) : error C2182: 'foo' : illegal use of type 'void'
दिलचस्प बात यह है कि '-std = c89 -pedantic' gcc के साथ भी इस के साथ अच्छा है। – Dave
जैसा कि मैं समझता हूं, प्रकार 'शून्य' प्रकार के एक चर को परिभाषित करना बीमार है, अपूर्ण प्रकार पर 'बाहरी' को लागू करना बीमार नहीं है, उदाहरण के लिए [उदाहरण] (http://ideone.com/v7VkF): ' अज्ञात आकार के साथ सरणी पर बाहरी ', जिसे बाद में परिभाषित किया गया है। हालांकि, ** §6.2.5.19 ** कहता है * "शून्य प्रकार में मूल्यों का एक खाली सेट होता है; यह एक अपूर्ण ऑब्जेक्ट प्रकार है जिसे पूरा नहीं किया जा सकता है।" *, यह देखते हुए कि आपके कोड को बाधा उल्लंघन के रूप में माना जाना चाहिए। तथ्य यह है कि यह '-pedantic' के साथ साफ रूप से संकलित करता है, यह कहता है कि यह एक विस्तार नहीं है यह जीसीसी बग या अस्पष्टता है जिसमें एमएसवीसी और जीसीसी मानक की व्याख्या करते हैं। –