2009-02-22 21 views
17

मैं स्रोत के शीर्ष पर "#include <stdlib.h>" करता हूं।जब gst = c99 सेट किया गया है तो यादृच्छिक() इंटरफ़ेस क्यों नहीं मिल सकता है?

उदाहरण संकलन:

/usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
In file included from f8.c:7: 
ctype-cmp.c: In function ‘randomized’: 
ctype-cmp.c:48: warning: implicit declaration of function ‘random’ 
ctype-cmp.c: In function ‘main’: 
ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’ 
[email protected]:t$ 

जब मैं -std = c99 बंद कर देते हैं, समारोह isfinite() नहीं पाया जा सकता है। तो मैं इस और अन्य कारणों के लिए -std = c99 का उपयोग करना चाहता हूं। क्या कोई चाल है जो मुझे याद आ रही है?

उत्तर

14

man srandom कहता है कि समारोह सी 99 का हिस्सा नहीं है लेकिन POSIX का हिस्सा है।

सक्रिय _BSD_SOURCE या _XOPEN_SOURCE >= 500 या किसी अन्य उपयुक्त सुविधा परीक्षण मैक्रो srandom/यादृच्छिक समारोह वाणी (man feature_test_macros और man srandom देखें)।

इस के पास अच्छे अवसर हैं, लेकिन आपको उन मैक्रोज़ को समझने की आवश्यकता है जिन्हें परिभाषित/परिभाषित नहीं किया गया है, जिससे उपरोक्त मैनपेज पढ़कर भी परिभाषित किया गया है।

/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall 
    -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
-1

मैं रैंड() और srand() का उपयोग करता हूं। बीटीडब्लू: क्या आप एक हेडर या दो भूल गए थे? कम से कम दूसरी चेतावनी मुझे बताती है।

गणित सहित प्रयास करें। (बस याद किया गया कि हमें हमेशा गणित पुस्तकालय के साथ समस्याएं थीं और वास्तव में इसे -एलएम के साथ लिंक करना पड़ा)।

+0

मैं नीचे सही हेडर के बाद से इस प्रतिक्रिया वोट करने के लिए शामिल किया गया था (दोनों stdlib और गणित)। यह चाल मैक्रो को परिभाषित कर रही थी। जवाब के लिए धन्यवाद! – SetJmp

+0

मैंने नहीं देखा कि आपने गणित का उल्लेख किया था। – dirkgently

+0

कुल सी नोब के रूप में, मैंने कम से कम 'srand' के उल्लेख की सराहना की। धन्यवाद! – jocull

12

हाँ, वहाँ एक चाल आप याद कर रहे हैं है: आप -std=gnu99 बजाय -std=c99 उपयोग कर सकते हैं।

-std=c99#define रों __STRICT_ANSI__, जो /usr/include/features.h "डिफ़ॉल्ट रूप से सी मानक के बाहर कुछ भी करने के लिए सक्षम नहीं है" के रूप में व्याख्या (इसके बिना, आप कम से कम _SVID_SOURCE और _BSD_SOURCE दोनों मिल)। -std=gnu99, दूसरी ओर, "सी 99 प्लस जीएनयू एक्सटेंशन" का अर्थ है (जीसीसी डिफ़ॉल्ट वर्तमान में -std=gnu89 है, इसका सी 8 9 समकक्ष है, यही कारण है कि आपको नई सी 99 सुविधाओं को प्राप्त करने के लिए कुछ निर्दिष्ट करने की आवश्यकता है)।

वैकल्पिक रूप से, आप सुविधा परीक्षण मैक्रोज़ सक्षम कर सकते हैं (जैसा कि @ litb के उत्तर में उल्लिखित है)। मेरे सिस्टम में /usr/include/stdlib.h पर देखकर, यह __USE_SVID, __USE_XOPEN_EXTENDED, या __USE_BSD में से एक की अपेक्षा करता है। /usr/include/features.h मुझसे कहता है कि सुविधा परीक्षण मैक्रो जो इन सक्षम होगा हैं:

  • _SVID_SOURCE (सक्षम बनाता है __USE_SVID)
  • _BSD_SOURCE (सक्षम बनाता है __USE_BSD)
  • _XOPEN_SOURCE कम से कम 500 के एक मूल्य के साथ (सक्षम बनाता है __USE_XOPEN_EXTENDED)
  • _XOPEN_SOURCE_EXTENDED (__USE_XOPEN_EXTENDED भी सक्षम करता है)
  • _GNU_SOURCE दोनों -std=gnu99 और -D_GNU_SOURCE है एक अच्छा विचार का उपयोग कर (सब कुछ सक्षम बनाता है, ऊपर चार फीचर परीक्षण मैक्रो सहित)

नए कार्यक्रमों जहाँ आप भविष्य मानकों से नए कार्यों के साथ संभावित नाम टकराव के बारे में भी चिंतित नहीं हैं,।यह आपको सभी नई मानक सुविधाओं और जीएनयू एक्सटेंशन का उपयोग करने की अनुमति देता है, जो कुछ प्रकार के फ़ॉलबैक के साथ संयुक्त होते हैं (उदाहरण के लिए, autoconf -स्टाइल फीचर टेस्ट) सबसे लचीलापन देता है।

संदर्भ:

0

मैं (संकलक विकल्पों के साथ: -std=gnu99 -D_GNU_SOURCE) Ubuntu 9.10 के तहत codeblocks में जीसीसी का उपयोग कर यादृच्छिक संख्या बना लिया है तो यह मेरे लिए काम किया:

यह मेरा कोड है जिसके साथ मैंने खेला था:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
enum computer {keyboard, CPU, screen, printer}; 
int main(void) 
{ 
    enum computer comp; 
    time_t casovac; 
    comp = CPU; 
    srand(&casovac); 
    printf("%d", rand()); 
    return 0; 
} 

यह था केवल विचार, बेशक आप इसे अन्य तरीके से पूरा कर सकते हैं ;-) [स्थापित करने के लिए codeblocks का उपयोग करें: sudo apt-get install build-essential और फिर sudo apt-get install codeblocks]