2014-06-13 5 views
7

यहाँ के उपयोग मेरी मृत सरल डमी कोड हैत्रुटि:</p> <pre><code>#include <errno.h> int main(void) { errno_t e; return 0; } </code></pre> <p>कौन सा आश्चर्यजनक रूप से इस त्रुटि को जन्म देती है: अघोषित पहचानकर्ता 'errno_t'

main.c:5:5: error: use of undeclared identifier 'errno_t' 
    errno_t x; 
    ^

मैं शुरू कर दिया पालन निशान: जब संकलक <...> समावेशन देखता है, यह पहले /usr/include पर देखेगा, जहां मुझे errno.h फ़ाइल मिली। वास्तव में यह है, यह में एक भी लाइन है लाइसेंस टिप्पणी है, जो है के अलावा:

#include <sys/errno.h> 

अब, errno.h में /usr/include/sys पर मैं निम्नलिखित लाइनों पाया:

#include <sys/cdefs.h> 

#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 
#include <sys/_types/_errno_t.h> 
#endif 

और _errno_t.h में /usr/include/_types पर मैंने पाया इस:

typedef int errno_t; 

तो यह की तरह लग रहा है, यह वहाँ है, और यह 012,354,612 के पूर्णांक प्रकार के उपनाम, और हिस्सा है- जैसा कि यह होना चाहिए।

फिर इसमें क्यों शामिल नहीं है? क्यों संकलक undeclared पहचानकर्ता त्रुटि उठाता है?

अग्रिम धन्यवाद!


प्रासंगिक जानकारी:

Compiler: 
    Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)` 

Compiler flags: 
    -std=c11 -I/usr/include/sys -I/usr/local/include 

मैक्रो चर __STDC_WANT_LIB_EXT1__ निम्नलिखित लाइनों में cdefs.h में /usr/include/sys में परिभाषित किया जाएगा:

/* If the developer has neither requested a strict language mode nor a version 
* of POSIX, turn on functionality provided by __STDC_WANT_LIB_EXT1__ as part 
* of __DARWIN_C_FULL. 
*/ 
#if !defined(__STDC_WANT_LIB_EXT1__) && !defined(__STRICT_ANSI__) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
#define __STDC_WANT_LIB_EXT1__ 1 
#endif 

अद्यतन:

@PaulR के रूप में टिप्पणी अनुभाग में कहा: अगर मैं -std=c11 झंडा निकाल दें, इसे संकलित करता है। ध्वज शामिल होने पर त्रुटि के रूप में जो आश्चर्यजनक है, उतना आश्चर्यजनक है। तो मैं इस प्रश्न को उप-प्रश्न के साथ बढ़ाता हूं:

errno_t सी 11 मानक का हिस्सा नहीं है, या यह क्यों शामिल नहीं है, जब मानक कंपाइलर के लिए निर्दिष्ट किया गया है?

+0

क्या आप 'cdefs.h' (सीधे या अन्य शामिल हैं) सहित हैं? '__STDC_WANT_LIB_EXT1__' को किसी शर्त पर परिभाषित किया गया है। क्या यह स्थिति पूरी हुई है? –

+0

@ ब्लूमून ने पोस्ट को अद्यतन किया - '/ usr/include/sys/errno.h' में यह जांचने से पहले शामिल है कि var को परिभाषित किया गया है या नहीं –

+0

ऐसा इसलिए है क्योंकि आप '-std = c11' के साथ संकलित कर रहे हैं - ले लो वह बाहर, या कम सख्त '-std = gnu11' का उपयोग करें, और यह ठीक ठीक संकलित करेगा। –

उत्तर

20

errno_t मानक प्रकार नहीं है; यह वैकल्पिक (और व्यापक रूप से नापसंद और असमर्थित) एनेक्स के का हिस्सा है, आईएसओ सी 11 के साथ ही एक विशेष विक्रेता की वजह से मानक को अनदेखा करने और छेड़छाड़ करने के इतिहास के साथ शामिल है।

के बाद से अनुलग्नक कश्मीर int रूप errno_t परिभाषित करता है, errno वस्तु के प्रकार int है, और सभी त्रुटि कोड int, बस अपने कार्यक्रमों में int का उपयोग कर रहे हैं।यह वैकल्पिक सुविधा पर भरोसा करने से कहीं अधिक पोर्टेबल है जो समर्थित होने की संभावना नहीं है।

+7

.. काफी एमएस ;-) –

+2

उन्हें समय दें - उनके लिए सी 99 के साथ पकड़ने में 15 साल लग गए हैं! –

+7

बड़ा मुद्दा यह है कि उन्होंने भाषा में अपने बेकार जोड़ों को एक मानक में लगाने की कोशिश करने का एक मुद्दा बना दिया है कि उनके पास निम्नलिखित में कोई रूचि या इरादा नहीं है। इस तरह मानकों को काम करने का तरीका नहीं है। यदि आप मानक का पालन नहीं करना चाहते हैं तो आपको इसे आकार देने की कोशिश में भाग नहीं लेना चाहिए। –

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