2012-09-21 2 views
42

एक पूर्वप्रक्रमक मैक्रो _GLIBCXX_USE_NANOSLEEP बुलाया दो मानक हेडर फाइल में प्रकट होता है:_GLIBCXX_USE_NANOSLEEP क्या है?

  • C++/4.7.1/x86_64-अज्ञात-linux-जीएनयू/बिट्स/C++ config.h
  • C++/

    01: 4.7.1/धागा

जीसीसी 4.7.1 (लिनक्स, 64-बिट) केवल एक चीज C++ config.h शामिल की एक डिफ़ॉल्ट निर्माण में इस टिप्पणी है

/* Defined if nanosleep is available. */ 
/* #undef _GLIBCXX_USE_NANOSLEEP */ 

जबकि धागा में, std::this_thread::sleep_for() और std::this_thread::sleep_until() की परिभाषा मैक्रो पर निर्भर परिभाषित किया जाना है। यदि यह परिभाषित नहीं किया गया है, तो दोनों कार्य – हालांकि सी ++ मानक – द्वारा आवश्यक है या तो परिभाषित नहीं किया जाएगा।

मेरे सिस्टम (glibc 2.15) पर, मैक्रो परिभाषित नहीं किया गया है, हालांकि nanosleep() फ़ंक्शन (ctime में घोषित) मौजूद है और परिचालन है।

मुझे पता है कि क्या इस बारे में और कैसे यह से निपटने के लिए सभी है चाहते हैं। विशेष रूप से:

  • वहाँ एक विन्यास वाला विकल्प है, this post ने सुझाव दिया जब डिफ़ॉल्ट रूप से इस मैक्रो को सक्रिय करने के जीसीसी का निर्माण किया जाना चाहिए, है? (मैं online documentation of the build process में कोई नहीं मिला।)
  • वहाँ वास्तव में nanosleep() समारोह और मैक्रो के बीच एक रिश्ता है?/time.h में nanosleep() की घोषणा मैक्रो पर निर्भर, या परिभाषित प्रतीत नहीं होती है।
  • वहाँ किसी भी विशिष्ट जोखिम मेरे अपने हेडर फाइल में मैक्रो को परिभाषित करने में शामिल है, या कमांड लाइन पर एक विकल्प के रूप में -D (this related question में सुझाव के रूप में)? क्या होगा यदि मैं इसे एक सिस्टम पर करता हूं जहां nanosleep() उपलब्ध नहीं है, और मैं वास्तव में कैसे पता लगा सकता हूं?

अद्यतन जीसीसी 4.8 के बाद से, std::this_thread::sleep_for() और पसंद के लिए समर्थन स्वचालित रूप से ++ libstdc में शामिल है। अब कोई कॉन्फ़िगरेशन ध्वज आवश्यक नहीं है। the GCC 4.8 change log से:

this_thread :: sleep_for(), this_thread :: sleep_until() और this_thread :: उपज() कॉन्फ़िगर विकल्प --enable-libstdcxx समय की आवश्यकता के बिना परिभाषित कर रहे हैं;

लेकिन जोनाथन के जवाब में दिए गए जीसीसी 4.8 और 4.9 के लिए इसके बारे में और जानकारी दें।

+0

क्या आपने इसे स्वयं बनाया है, या यह एक रखरखाव-आपूर्ति सी ++ है? – nneonneo

+0

@nneonneo मैंने इसे [निर्माण विवरण] (http://gcc.gnu.org/install/) के बाद बनाया, उपयोगकर्ता-विशिष्ट निर्देशिकाओं को छोड़कर कोई विशेष विकल्प नहीं उपयोग किया। – jogojapan

+1

किसी भी समय, 'nanosleep' के लिए' कॉन्फ़िगर करें 'जांच करता है? इसने क्या कहा? – nneonneo

उत्तर

68

जब libstdC++ बनाया गया है इसके configure स्क्रिप्ट क्या सुविधाओं का समर्थन कर रहे हैं, और आधार पर परिणामों को परिभाषित करता है (या undefines) विभिन्न मैक्रोज़ पर c++config.h

में अपने मामले configure में निर्धारित देखने के लिए अपने सिस्टम का परीक्षण है कि POSIX nanosleep() समारोह उपलब्ध नहीं है और मैक्रो परिभाषित नहीं है। हालांकि, जैसा कि आप कहते हैं, nanosleep() आपके सिस्टम पर उपलब्ध है।कारण यह configure रूप से सक्षम नहीं है कि यह के लिए चेक भी जब तक आप --enable-libstdcxx-time विकल्प (Configuration chapter of the libstdc++ manual में दस्तावेज, नहीं जीसीसी कॉन्फ़िगर डॉक्स)

  • वहाँ एक विन्यास विकल्प है का उपयोग नहीं चला है इसका उपयोग इस मैक्रो को डिफ़ॉल्ट रूप से सक्रिय करने के लिए जीसीसी बनाने के दौरान किया जाना चाहिए, जैसा कि इस पोस्ट द्वारा सुझाया गया है? (मैं निर्माण प्रक्रिया का ऑनलाइन प्रलेखन में कोई नहीं मिला।)

हाँ, --enable-libstdcxx-time

  • वहाँ वास्तव में नैनोस्लीप() फ़ंक्शन और के बीच एक रिश्ता है मैक्रो? Ctime/time.h में नैनोस्लीप() की घोषणा मैक्रो पर निर्भर, या परिभाषित प्रतीत नहीं होती है।

glibc के समारोह की घोषणा ++ के libstdc पर मैक्रो निर्भर नहीं करता है, नहीं। लेकिन मैक्रो libstdC++ बताता है कि फ़ंक्शन का उपयोग करना है या नहीं।

  • वहाँ किसी भी विशिष्ट जोखिम मेरे अपने हेडर फाइल में मैक्रो को परिभाषित करने में शामिल है, या कमांड लाइन पर एक-डी विकल्प के रूप में (यह संबंधित सवाल में सुझाव के रूप में)? क्या होगा यदि मैं ऐसा सिस्टम पर करता हूं जहां नैनोस्लीप() उपलब्ध नहीं है, और मैं वास्तव में कैसे पता लगा सकता हूं?

यह शरारती है और असमर्थित है, लेकिन काम करेंगे। मैक्रो एक आंतरिक कार्यान्वयन विवरण है जिसे कॉन्फ़िगर करके सेट किया जाना चाहिए और उपयोगकर्ताओं द्वारा नहीं और कार्यान्वयन के आंतरिक मैक्रोज़ की परिभाषा को बदलना चीजों को तोड़ सकता है। लेकिन इस मामले में ऐसा नहीं होगा क्योंकि केवल उस कोड पर निर्भर करता है जो हेडर में है, libstdc++.so में कोई लाइब्रेरी कोड प्रभावित नहीं है।

लेकिन जीसीसी को पुनर्स्थापित करना और --enable-libstdcxx-time विकल्प का उपयोग करना बेहतर होगा, या यदि यह संभव नहीं है तो मैक्रो को सही करने के लिए अपने c++config.h को संपादित करें।

यदि आप इसे एक अलग सिस्टम पर परिभाषित करते हैं जहां nanosleep() उपलब्ध नहीं है तो आपको #include <thread> पर संकलन त्रुटि मिल जाएगी।

मेरे पास उस कॉन्फ़िगरेशन को बेहतर बनाने के लिए ideas है, इसलिए nanosleep() और sched_yield() डिफ़ॉल्ट रूप से चेक किया जाएगा, लेकिन मेरे पास अभी तक काम करने का समय नहीं है।

अद्यतन: मैं कुछ बदलाव के लिए प्रतिबद्ध है ताकि --enable-libstdcxx-time बिना जीसीसी 4.8 निर्माण अभी भी std::this_thread::yield() परिभाषित करेगा (नो-सेशन के रूप में) और कम संकल्प ::sleep() और ::nanosleep() के बजाय ::usleep() कार्यों का उपयोग कर std::this_thread::sleep_for() और std::this_thread::sleep_until() लागू करेंगे। हालांकि --enable-libstdcxx-time को परिभाषित करना अभी भी बेहतर है।

एक और अद्यतन: जीसीसी 4.9.0 बाहर है और अब है चूक स्वचालित रूप से प्लेटफार्मों कि उन्हें समर्थन करने के लिए जाना जाता है पर nanosleep और sched_yield को सक्षम करने के लिए।--enable-libstdcxx-time का उपयोग करने की कोई आवश्यकता नहीं है।

+3

** यह एक अच्छा जवाब है और कई अपवॉट्स के हकदार हैं। ** (मैं अब सही वर्तनी वाले विकल्प के साथ पुनर्निर्माण कर रहा हूं और एक बार समाप्त होने के बाद रिपोर्ट करूंगा, लेकिन किसी भी मामले में, यह उस पृष्ठभूमि को बताता है जिसमें मुझे रूचि थी।) – jogojapan

+0

बस पुष्टि करने के लिए: विकल्प की वर्तनी को सही करने के बाद, यह काम किया। एक बार फिर धन्यवाद। – jogojapan

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