2009-12-13 11 views
7

सोलारिस में, जीसीसी मुझे समारोह `getopt 'सोलारिस में getopt निहित घोषणा?

की

निहित घोषणा जब

#include <unistd.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    getopt(1,argv,""); 
    return 0; 
} 

man page संकलन getopt के लिए unistd.h या stdio सहित के बारे में कुछ देता है कहते हैं। एच, हालांकि मैं दोनों को उलझन में डाल रहा हूं, फिर भी मुझे यह चेतावनी मिलती है। क्या यह सामान्य है? उन कार्यों का उपयोग कर रहा है जिन्हें यूनिक्स विकास में स्पष्ट रूप से घोषित नहीं किया गया है?

+1

तुम इसे कैसे संकलन कर रहे हैं? –

+0

मैं gcc -ansi -pedantic -Wall – Steven

+0

@Steven के साथ संकलित कर रहा हूं "grep getopt /usr/include/*.h" वापसी क्या करती है? – Scooter

उत्तर

1

आदमी पेज stdio.h, नहीं stdlib.h शामिल करने के लिए कहते हैं। stdio.h समस्या को हल करता है?

+0

नहीं, मैं सवाल reflext को – Steven

+0

--ansi की है कि इसके बजाय अपडेट करने और मानक, -std = मानक इस्तेमाल किया जा सकता के बारे में स्पष्ट होना चाहता हूँ प्रदान की हूँ। उदाहरण के लिए: -std = gnu90 किसी भी चेतावनी w/o संकलित करता है और इस समय डिफ़ॉल्ट सेटिंग है (जब -std छोड़ा जाता है)। –

9

आप -ansi के साथ संकलित कर रहे हैं, और उस मोड में getopt उपलब्ध नहीं हो सकता है, क्योंकि -ansi का अर्थ है C89 अनुरूप मोड। कि स्विच, या #define _GNU_SOURCE को हटाने #include <unistd.h> से पहले की कोशिश करो। getopt() POSIX है, एएनएसआई नहीं।

संपादित करें: आपको शायद _GNU_SOURCE की आवश्यकता नहीं है। this के अनुसार, आप पूर्वप्रक्रमक मैक्रो को परिभाषित ऐसी है कि यह सच है के साथ कार्यक्षमता प्राप्त करने के लिए सक्षम होना चाहिए:

#if _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _POSIX_SOURCE 

सुविधा परीक्षण मैक्रो बारे में अधिक जानकारी के लिए this देखें।

+0

हटाने -ansi वास्तव में चेतावनी को हटा देता है। हालांकि, मुझे आश्चर्य है कि क्यों getopt() C89 अनुरूप नहीं है जब मैंने उपयोग किए गए हर दूसरे POSIX फ़ंक्शन को कोई चेतावनी नहीं दी # परिभाषित करें _GNU_SOURCE हालांकि यह नहीं है (यह सोलारिस है) – Steven

+0

मेरा संपादन देखें। C89 getopt को परिभाषित नहीं करता: तो glibc यह बेनकाब करने के लिए के लिए जब C89 मोड में संकलन यह गलत होगा। हालांकि, चूंकि इसे unistd.h में घोषित किया गया है, जो C89 में मौजूद नहीं है, शायद glibc ऐसा कर सकता है, मुझे यकीन नहीं है। –

1

का उपयोग gnu99 मेरे लिए इसे हल:

gcc -std=gnu99 file.c 

यह unistd.h के साथ है।

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