2009-03-15 10 views
15

This MSDN article बताता है कि getcwd() को बहिष्कृत किया गया है और आईएसओ सी ++ संगत _getcwd का उपयोग इसके बजाय किया जाना चाहिए, जो प्रश्न उठाता है: getcwd() आईएसओ-अनुरूप नहीं बनाता है?क्यों getcwd() आईएसओ सी ++ अनुरूप नहीं है?

उत्तर

19

मानक में निर्दिष्ट कार्यों को अंडरस्कोर द्वारा पूर्ववत नहीं किया जाना चाहिए, यह संकेत है कि वे विक्रेता-विशिष्ट एक्सटेंशन हैं या गैर-आईएसओ मानक का पालन करते हैं। इस प्रकार माइक्रोसॉफ्ट के लिए इस विशिष्ट कार्य के नाम पर अंडरस्कोर जोड़ने के लिए "अनुपालन" था क्योंकि यह आईएसओ मानक का हिस्सा नहीं है।

+1

उनके पास विंडोज एपीआई को परिवर्तित करने का काम खत्म हो गया है :-) –

+4

मुझे नहीं लगता कि किसी ने कभी दावा किया है कि Win32 API किसी भी चीज़ के अनुरूप था। यदि आप वीसी ++ में भाषा एक्सटेंशन अक्षम करते हैं तो windows.h संकलित भी नहीं होता है। :) – jalf

+1

उलझन में बात यह है कि उन्होंने इसे ऐसे कार्यों को करने के लिए किया जो मानक सी हेडर में भी नहीं थे। –

3

जहां तक ​​मुझे पता है कि getcwd() कभी भी आईएसओ मानक सी ++ का हिस्सा नहीं रहा है। _getcwd() निश्चित रूप से नहीं है, क्योंकि मानक नाम अंडरस्कोर से शुरू नहीं होंगे।

वास्तव में, एमएसडीएन लेख एक मैन पेज से लिंक करता है जो कहता है कि इसे direct.h में घोषित किया गया है, जो एक मानक सी ++ हेडर फ़ाइल नहीं है। लेख मेरे लिए फर्जी लगता है।

3

दान ओल्सन के पद पर पर जोड़ने के लिए: MSDN

पर ANSI C Compliance पेज देखें

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

4

के रूप में दूसरों को पहले ही बताया है, getcwd आईएसओ सी ++ में शामिल नहीं है, लेकिन POSIX/IEEE Std 1003.1 का हिस्सा है।

माइक्रोसॉफ्ट ने अपने सी मानक लाइब्रेरी में सबसे अधिक इस्तेमाल किए जाने वाले POSIX फ़ंक्शंस को शामिल करने का निर्णय लिया है (लेकिन इन कार्यों को अंडरस्कोर के साथ अनिवार्य रूप से उनके उपयोग को हतोत्साहित करने के लिए उपसर्ग करें)।

23

इसके बारे में good discussion है।

क) के लिए कार्यान्वयन द्वारा परिभाषित उन: इस

मैं पुरुष जो 1983 में वापस जोर देकर कहा कि एक सी कार्यक्रम के लिए उपलब्ध नामों में से अंतरिक्ष में विभाजित किया जा रहा हूँ करने के लिए P.J. Plauger जवाब (जैसे printf के रूप में)
ख) प्रोग्रामर (जैसे foo के रूप में)
ग) प्रोग्रामर कार्यान्वयन (जैसे _unlink के रूप में)के लिए आरक्षित उन लोगों के लिए आरक्षित उन के लाभ

हम भी तो जानता था कि "कार्यान्वयन" भी अखंड था - कार्यान्वयन के अक्सर एक से अधिक स्रोत की आपूर्ति बिट्स - लेकिन यह है कि सबसे अच्छा हम समय में कर सकते थे। मानक सी ++ ने मदद के लिए नामस्थान प्रस्तुत किए हैं, लेकिन उन्होंने अपने लक्षित लक्ष्यों का एक अंश केवल हासिल किया है।

इस विशेष मामले में, POSIX श्रेणी की एक सूची की आपूर्ति (यह क्या होता है जब आप एक कागज बाघ मानकीकरण है।) (क) के नाम (जैसे अनलिंक के रूप में) आप परिभाषित किया जाना चाहिए कि जब और केवल जब तुम शामिल कुछ शीर्षलेख।चूंकि सी मानक ने अपने शीर्षलेखों को यूनिक्स से चुरा लिया है, जो कि पॉक्सिक्स के समान स्रोत है, उनमें से कुछ शीर्षलेख ऐतिहासिक रूप से ओवरलैप करते हैं। फिर भी, कंपाइलर चेतावनियों में को ध्यान में रखना चाहिए कि समर्थित वातावरण "शुद्ध" मानक सी ++ (एक प्लेटोनिक आदर्श) या मिश्रित सी/सी ++/पॉसिक्स पर्यावरण है। माइक्रोसॉफ्ट द्वारा हमें खराब प्रोग्रामर की मदद करने के लिए वर्तमान प्रयास इसे ध्यान में रखने में विफल रहता है। यह को एक श्रेणी (बी) नाम के रूप में अनलिंक करने पर जोर देता है, जो मायोपिक है।

ठीक है, जीसीसी सख्त सी मोड में POSIX नाम की घोषणा नहीं करेगा, कम से कम (हालांकि, यह अभी भी करता है सी ++ मोड में):

#include <stdio.h> 

int main() { 
    &fdopen; 
    return 0; 
} 

-std=c99

test.c: In function 'main': 
test.c:4: error: 'fdopen' undeclared (first use in this function) 

आप का उपयोग कर उत्पादन इसे स्पष्ट रूप से यह बताना होगा कि आप फीचर टेस्ट मैक्रोज़ का उपयोग कर मिश्रित सी/पॉक्सिक्स में काम कर रहे हैं या किसी विशिष्ट मानक को पार नहीं कर रहे हैं। यह तब gnu89 पर डिफ़ॉल्ट होगा जो एक मिश्रित वातावरण मानता है (man feature_test_macros)। जाहिर है, एमएसवीसी में यह संभावना नहीं है।

+3

जीसीसी पीओएसईक्स या यहां तक ​​कि मानक सी नाम घोषित नहीं करता है। वह glibc का काम है। – Potatoswatter

2

रिकॉर्ड के लिए, getcwd() आईएसओ द्वारा बहिष्कृत नहीं किया गया था। यह माइक्रोसॉफ्ट द्वारा "बहिष्कृत" था। माइक्रोसॉफ्ट कई सी कार्यों को फिर से लिखता है - अक्सर दिमाग में थोड़ा बेहतर सुरक्षा के साथ (कहें, स्ट्रिंग फ़ंक्शन जो max_length पैरामीटर भी लेते हैं)। तब उन्होंने अपने संकलक को इन चेतावनियों को थूक दिया था, जिन्हें मैं फर्जी मानता हूं क्योंकि कोई मानक समूह बहिष्कृत घोषित कार्यों में से किसी को भी हटा देता है।

+8

_CRT_SECURE_NO_WARNINGS और भूल जाओ :) –

+0

प्रश्न: "क्यों getcwd है() नहीं आईएसओ शिकायत/यह MSDN लेख कहा गया है कि() पदावनत किया गया है getcwd ...?" उत्तर: "getcwd() पदावनत नहीं है, माइक्रोसॉफ्ट थूकना है 'बहिष्कृत' की एक अजीब परिभाषा के साथ चेतावनी बाहर। " यह प्रश्न का उत्तर कैसे नहीं देता है? मैं किस तरह से स्पष्टीकरण मांग रहा था? –

+0

'getcwd()' जीएनयू द्वारा भी बहिष्कृत किया गया है।मैन पेज देखें "पोर्टेबिलिटी और सुरक्षा कारणों के लिए, getwd() का उपयोग बहिष्कृत किया गया है।" –

3

एमएसडीएन आलेख कुछ हद तक भ्रमित है कि एक सामान्य व्यक्ति केवल एक त्वरित पढ़ने से निष्कर्ष निकाला जाएगा (यदि वे इसे बहुत सावधान वकील आंख से नहीं पढ़ते हैं)।

एमएसडीएन लेख क्या कहता है: getcwd() आईएसओ सी ++ मानक के अनुरूप नहीं है। कार्यों के नामकरण के लिए उस आईएसओ सी ++ मानक का पालन करने के लिए (जो getcwd उल्लंघन करता है), माइक्रोसॉफ्ट सही ढंग से फंक्शन के सामने एक _ डालता है, इसलिए एक ही कार्य _getcwd() बन जाता है। यह फ़ंक्शन नामकरण का आईएसओ सी ++ अनुपालन तरीका है क्योंकि getcwd() और _getcwd() एक आईएसओ सी ++ मानक फ़ंक्शन नहीं हैं, लेकिन एक माइक्रोसॉफ्ट (विक्रेता) विशिष्ट, या कार्यान्वयन विशिष्ट फ़ंक्शन हैं।

आलेख यह इंगित नहीं करता कि कार्यशील निर्देशिका प्राप्त करने के लिए सी ++ आईएसओ मानक कॉल क्या होगा ... हालांकि यह है कि लोग त्वरित नज़र में क्या पढ़ते हैं।

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