यहाँ के उपयोग मेरी मृत सरल डमी कोड हैत्रुटि:</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 मानक का हिस्सा नहीं है, या यह क्यों शामिल नहीं है, जब मानक कंपाइलर के लिए निर्दिष्ट किया गया है?
क्या आप 'cdefs.h' (सीधे या अन्य शामिल हैं) सहित हैं? '__STDC_WANT_LIB_EXT1__' को किसी शर्त पर परिभाषित किया गया है। क्या यह स्थिति पूरी हुई है? –
@ ब्लूमून ने पोस्ट को अद्यतन किया - '/ usr/include/sys/errno.h' में यह जांचने से पहले शामिल है कि var को परिभाषित किया गया है या नहीं –
ऐसा इसलिए है क्योंकि आप '-std = c11' के साथ संकलित कर रहे हैं - ले लो वह बाहर, या कम सख्त '-std = gnu11' का उपयोग करें, और यह ठीक ठीक संकलित करेगा। –