2011-05-25 7 views
5

मैं अन्यथा अज्ञात प्लेटफ़ॉर्म पर जीसीसी 4.6.0 () का उपयोग कर रहा हूं।क्या क्रिप्ट() फ़ंक्शन unistd.h या crypt.h में घोषित किया गया है?

मैं पासवर्ड को एन्क्रिप्ट करने के लिए crypt() फ़ंक्शन का उपयोग कर रहा हूं।

मुझे लगता है कि समारोह इस्तेमाल नहीं किया है पहले तो मैं मुख्य पेज की जाँच:

man 3 crypt 

और यह unistd.h हेडर को शामिल करने के लिए कहते हैं।

हालांकि, जब मैंने ऐसा किया, तो मुझे crypt फ़ंक्शन के लिए एक निहित चेतावनी मिली।

warning: implicit declaration of function ‘crypt’ [-Wimplicit-function-declaration] 

मैं खोज का एक सा था और मैंने पाया आप crypt.h शामिल करने के लिए है। हालांकि, यह कैसे नहीं कहता है कि मैन पेज में?

+0

मेरा नाम 'gcc 4.6.0' नहीं है। –

+0

कृपया संकलन समय पर आपको प्राप्त होने वाली सटीक चेतावनी पोस्ट करें। –

+0

@ माइकल, मैंने अपने प्रश्न को चेतावनी के साथ जोड़ा है जो मुझे मिल रहा है। – ant2009

उत्तर

3

यह भी मेरे मैन पेज में #define _XOPEN_SOURCE (unistd.h सहित) कहता है। तो आपको शायद crypt की घोषणा का पर्दाफाश करने के लिए इसे जोड़ना चाहिए।

संपादित

मैं सिर्फ यह कोशिश की। unistd.hऔर#define _XOPEN_SOURCE सहित यह चाल करने से पहले। इसे अकेले सहित पर्याप्त नहीं है।

का उपयोग

gcc version 4.6.0 20110429 
GNU C Library stable release version 2.13 

unistd.h में देख रहे हैं:

/* XPG4.2 specifies that prototypes for the encryption functions must 
    be defined here. */ 
#ifdef __USE_XOPEN 
/* Encrypt at most 8 characters from KEY using salt to perturb DES. */ 
extern char *crypt (__const char *__key, __const char *__salt) 
    __THROW __nonnull ((1, 2)); 
+0

मैंने _XOPEN_SOURCE जोड़ा था। हालांकि, मुझे अभी भी इसके साथ चेतावनी मिल रही थी। – ant2009

+1

आप इसे परिभाषित नहीं करते हैं बल्कि इसे एक मूल्य देते हैं। मूल्य नवीनतम मानक के लिए 700 होना चाहिए। –

+0

@ आर .. यह समझदार लगता है, लेकिन मैन पेज '#define _XOPEN_SOURCE' कहता है। मैंने हालांकि कोशिश नहीं की है। – cnicutar

3

crypt() के लिए POSIX मानक कहना है कि यह, <unistd.h> में घोषित किया जाना चाहिए ताकि आप क्या शामिल करने की ज़रूरत है।

हालांकि, आपके द्वारा निर्दिष्ट अन्य कंपाइलर विकल्पों के आधार पर, आप इसे देख सकते हैं या नहीं देख सकते हैं।

मैं वर्तमान में एक शीर्ष लेख मैं "posixver.h" फोन जो कोड होता है का उपयोग करें:

#ifndef JLSS_ID_POSIXVER_H 
#define JLSS_ID_POSIXVER_H 

/* 
** Include this file before including system headers. By default, with 
** C99 support from the compiler, it requests POSIX 2001 support. With 
** C89 support only, it requests POSIX 1997 support. Override the 
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE. 
*/ 

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */ 
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */ 
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */ 

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE) 
#if __STDC_VERSION__ >= 199901L 
#define _XOPEN_SOURCE 600 /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */ 
#else 
#define _XOPEN_SOURCE 500 /* SUS v2, POSIX 1003.1 1997 */ 
#endif /* __STDC_VERSION__ */ 
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */ 

#endif /* JLSS_ID_POSIXVER_H */ 

सिस्टम जहाँ मैं काम पर, की स्थापना _XOPEN_SOURCE 700 हताशा और निरर्थकता में एक अभ्यास हो सकता है, लेकिन ज्यादा मैं चाहूँगा ऐसा करने में सक्षम होने के लिए। लेकिन ये विकल्प आमतौर पर लिनक्स, एचपी-यूएक्स, मैकोज़ एक्स, एईक्स और सोलारिस पर मेरे कोड को सही तरीके से काम करते हैं - यूनिक्स-जैसे प्लेटफॉर्म जो मैं आम तौर पर काम करता हूं।

और यह तब काम करता है जब मैंने जीसीसी को -std=c99 मोड में सेट किया। यदि आप -std=gnu99 का उपयोग करते हैं, तो आपको शायद शीर्षलेख की आवश्यकता नहीं है; यह स्वचालित रूप से सी 99 मानक प्लस एक्सटेंशन को सक्षम बनाता है।

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

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