سؤال

هذه المقالة MSDN الدول التي getcwd() وقد انتقدت وأن ISO C++ متوافق _getcwd ينبغي أن تستخدم بدلا من ذلك ، الأمر الذي يثير السؤال التالي:ما يجعل getcwd() لا ISO المتوافقة?

هل كانت مفيدة؟

المحلول

ومن المفترض أن تكون مسبوقة من قبل تسطير كمؤشر انهم ملحقات ببائعي أو الانضمام إلى مستوى غير ISO-ظائف غير محددة في المعيار. وهكذا فإن "الامتثال" هنا لمايكروسوفت لإضافة تسطير إلى اسم هذه الوظيفة المحددة لأنها ليست جزءا من معيار ISO.

نصائح أخرى

هناك مناقشة جيدة حول ذلك. P. J.Plauger الإجابات على هذا

أنا الرجل الذي أصر مرة أخرى في عام 1983 أن الفضاء الأسماء المتاحة برنامج C تكون مقسمة إلى:

أ) تلك المعرفة من خلال تنفيذ لصالح مبرمج (مثل printf)
ب) تلك محفوظة للمبرمج (مثل فو)
ج) تلك المخصصة لتنفيذ (مثل _unlink)

عرفنا حتى ذلك الحين أن "تنفيذ" كان أيضا متجانسة -- في كثير من الأحيان أكثر من مصدر إمدادات أجزاء من تنفيذ -- ولكن هذا كان أفضل ما يمكن القيام به في ذلك الوقت.معيار C++ وقد أدخلت مساحات للمساعدة ، لكنها لم تحقق سوى جزء من أهدافها المعلنة.(هذا ما يحدث عندما توحيد نمر من ورق.)

في هذه الحالة بالذات ، Posix الإمدادات قائمة الفئة (أ) أسماء (مثل ربط) التي يجب أن تحصل على المعرفة عندما وفقط عندما كنت وتشمل بعض الرؤوس.منذ C القياسية سرق لها رؤوس من Unix, وهو نفس المصدر مثل Posix بعض تلك الرؤوس تداخل تاريخيا.ومع ذلك, مترجم تحذيرات يجب أن يكون طريقة الأخذ بعين الاعتبار ما إذا كان دعم البيئة هو "نقية" معيار C++ (الأفلاطونية المثالية) أو مختلطة C/C++/Posix البيئة.الحالي محاولة من مايكروسوفت لمساعدة الفقراء المبرمجين لا تأخذ ذلك بعين الاعتبار.فإنه يصر على علاج ربط الفئة (ب) الاسم الذي هو قصر النظر.

وكذلك دول مجلس التعاون الخليجي لن تعلن POSIX الأسماء في الصارم ج الوضعية ، على الأقل (على الرغم من أنه لا يزال في C++ الوضعية):

#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)

سيكون لديك أن أقول صراحة أن كنت تعمل في مكان مختلط ج/Posix باستخدام ميزة اختبار وحدات الماكرو أو لا يمر أي معيار محدد.فإنه سيتم ثم التقصير ، gnu89 الذي يفترض بيئة مختلطة (man feature_test_macros).على ما يبدو ، MSVC لا يكون هذا الاحتمال.

وكما أشار آخرون بالفعل، لا يتم تضمين getcwd في ISO C ++، ولكن هو جزء من <لأ href = "http://www.opengroup.org/onlinepubs/009695399/functions/getcwd.html" يختلط = " نوفولو noreferrer "> POSIX / IEEE الأمراض المنقولة جنسيا 1003.1.

قررت

ومايكروسوفت لتشمل بعض الوظائف الأكثر استخداما POSIX في مكتبة C مستواها (ولكن بادئة هذه الوظائف مع تسطير إلى تثبيط أساسا استخدامها).

وكما بقدر أنا getcwd علم () لم يكن أبدا جزءا من معيار ايزو C ++. _getcwd () هي بالتأكيد ليست، كما لن تبدأ أسماء القياسية مع تسطير.

في الواقع، فإن المقالة على ارتباطات MSDN إلى صفحة رجلا أن يقول انها اعلنت في على direct.h ، أو التي ليس ملف رأس قياسي C ++. ويبدو أن المادة همية بالنسبة لي.

لسجل، لم يكن إهمال getcwd() التي كتبها ISO. كان "إهمال" من قبل مايكروسوفت. أعاد مايكروسوفت العديد من المهام C - في كثير من الأحيان مع قليل من تحسن الوضع الامني في الاعتبار (مثلا، وظائف سلسلة أيضا أن تأخذ المعلمة max_length). وبعد ذلك كان المترجم من بصق هذه التحذيرات، التي اعتبرها وهمية لأنه لا يوجد مجموعة معايير إهمال أي من الوظائف المعلنة إهمال.

وهذه المادة MSDN مربكة إلى حد ما في ما يمكن للشخص العادي أن يستنتج من مجرد قراءة سريعة (إذا لم يكن لقراءتها مع محام العين دقيق جدا).

وماذا يقول المقال MSDN هو: getcwd () غير متوافق مع معيار ISO C ++. ليتوافق مع هذا المعيار ISO C ++ لتسمية وظائف (وهو ما يخالف getcwd)، ومايكروسوفت وضعت بشكل صحيح و_ على الجبهة وظيفة، لذلك يصبح نفس الوظيفة _getcwd (). وهذا هو الطريق ISO C ++ المتوافقة مع تسمية وظيفة لgetcwd () و_getcwd () ليست لISO C ++ وظيفة القياسية، ولكن هي مايكروسوفت (بائع) معين، أو تنفيذ وظيفة معينة.

وهذه المادة لا تشير إلى ما مكالمة القياسية C ++ ISO للحصول على ان يكون دليل عمل ... على الرغم من thats ما يميل الناس إلى قراءة في لمحة سريعة.

scroll top