c - unistd.h and c99 on Linux -
यह सरल। सी फ़ाइल:
#include & lt; unistd.h & gt; शून्य परीक्षण () {चार स्ट्रिंग [40]; gethostname (स्ट्रिंग, 40); }
... सामान्य रूप से संकलित होने पर, ठीक काम करता है:
$ cc -Wall -c -o tmp.o tmp.c $
... परन्तु C99 मोड में संकलित होने पर, एक चेतावनी दी जाती है:
$ cc -Wall -std = c99 -c -o tmp.o tmp.c Tmp.c: फ़ंक्शन `टेस्ट ': tmp.c: 5: चेतावनी: फ़ंक्शन` gethostname' $
के परिणामस्वरूप घोषणा। परिणामी। ओ फ़ाइल ठीक है, और लिंक जोड़ना है मैं सिर्फ चेतावनी से छुटकारा चाहूंगा मैं इसे अपने ही .h फाइल में घोषणाओं के जरिए इसे प्राप्त कर सकता हूं।
सीएम 99 के बारे में क्या है जिसका मतलब है कि unistd.h में घोषणाएं शामिल नहीं हुई हैं? सीएएम के निकोलस को छोड़ने के बाद क्या यह दूर किया जा सकता है?
मुझे अन्य मानक लिब्स के लिए एक ही समस्या दिखाई देती है।
से आदमी gethostname
फ़ीचर टेस्ट मैक्रो के लिए आवश्यकताएँ glibc (देखें feature_test_macros (7)):
gethostname (): _BSD_SOURCE || _XOPEN_SOURCE & gt; = 500 sethostname (): _BSD_SOURCE || (_XOPEN_SOURCE & amp; _XOPEN_SOURCE & lt; 500)
ऐसा:
#define _BSD_SOURCE #include & lt; unistd.h & gt; शून्य परीक्षण () {चार स्ट्रिंग [40]; gethostname (स्ट्रिंग, 40); }
धूर्त विवरण:
यदि आप -std-c99
विकल्प निर्दिष्ट नहीं करते हैं, तो features.h
(जो कि unistd.h
द्वारा निहित है) _BSD_SOURCE
को सेट करने के लिए डिफ़ॉल्ट रूप से gethostname () शामिल हो जाता है हालांकि,
-std = c99
निर्दिष्ट करने से कंपाइलर स्वतः __ STRICT_ANSI __
को परिभाषित करता है, जिसके बदले में features.h
परिभाषित नहीं करने के लिए _BSD_SOURCE
, जब तक कि आप इसे अपनी स्वयं की फीचर मैक्रो परिभाषा (ऊपर के रूप में) से बाध्य नहीं करते।
Comments
Post a Comment