سؤال

لقد أزعجت حقًا إدراج ج stdlib وظائف على مساحة الاسم العالمية وانتهى الأمر بكتابة أشياء مثل :: snprintf أو :: errno أو struct :: stat ، إلخ ، للتمييز عن بعض وظائفي الخاصة في مساحة الاسم المرفقة حيث تم استخدام وظائف C stdlib هذه.

ثم اكتشفت أن هناك طريقة لإعلان كل وظيفة stdlib C في مساحة اسم STD (مثل STL): فقط قم بتضمين <C (lib)> بدلاً من <(lib) .h> لذلك قمت بتحرير الكود الخاص بي. الجديد "C لـ C ++" يشمل.

على ديبيان/دول مجلس التعاون الخليجي 4.3.4 اضطررت إلى مشكلتين:

1) #error يتطلب هذا الملف دعم التحويل البرمجي والمكتبة لمعايير ISO C ++ القادمة ، C ++ 0x. هذا الدعم هو تجريبي حاليًا ، ويجب تمكينه باستخدام -STD = C ++ 0x أو -STD = GNU ++ 0x Options.

2) باستخدام -std = c ++ 0x يجمع البرنامج الخاص بي على ما يرام ، لكنني لم أقم بتعديل :: snprintf أو :: time ، إلخ. استخدام اسم للمحطة ولا حتى مرة)

أي أفكار؟

على سبيل المثال .. كيف تمنع C stdlib من غزو مساحة اسمي العالمية؟ <c (lib)> هي ميزة تجريبية لمعيار C ++ التالي أو يمكن استخدامها بأمان الآن؟

ثم لدي شك آخر في أنه ربما يستحق سؤالًا جديدًا .. لا يوجد cmalloc. أعرف التاريخ كله عن استبدال malloc الجديد ولماذا. ولكن بالنسبة للمخازن المؤقتة البايت البسيطة ، لا يوجد أي مكافئ C ++ Realloc. أعلم أن كتل الذاكرة وإعادة التخصيص هي تنفيذ/محددة للغاية ، ولكن عندما تكون هناك كتل مجانية مجاورة من الذاكرة تعمل بشكل أفضل من تخصيص المخزن المؤقت الجديد ونسخة الذاكرة.

شكرا =)!

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

المحلول

لسؤالك الأول ، يعتمد ذلك على الرؤوس التي تحاول تضمينها. معظم رؤوس C متوفرة في c(lib) شكل في الإصدار الحالي من C ++. عدد قليل منها ليس كذلك ، ويمكن إضافته في C ++ 0x. لذلك إذا حاولت تضمين أي من هؤلاء ، فقد تكون قد حصلت على هذا الخطأ.

ثانياً ، جميع رؤوس هذا النموذج ضمان أن يتم توفير الوظائف في std مساحة الاسم. لكنهم لا يعدون بترك مساحة الاسم العالمية وحدها. في كثير من الأحيان ، وضعوا الرموز في كلا مساحات الأسماء.

لست متأكدا لماذا ::snprintf يزعجك أكثر من std::snprintf على أية حال. يجب عليك تحديد بادئة في كلتا الحالتين.

أما بالنسبة لل realloc, ، لا يوجد مكافئ C ++ ، ربما لأنه مشكلة أكثر مما يستحق ، خاصة مع دلالات C ++ الأكثر تعقيدًا لنسخ الكائنات. (على وجه الخصوص ، إذا حاولت استخدامه ، فلا تخزن أي كائنات غير POD في المخزن المؤقت realloc سوف فقط memcpy لهم إلى مخزن مؤقت مخصص حديثًا إذا لزم الأمر ، والذي سيؤدي إلى كسر الكائنات غير البارزة.)

بالطبع ، لا يزال بإمكانك استخدام القديم realloc من C بتضمين رأسها. لكنني أقول أنك ربما تكون أفضل حالًا في استخدام New/Delete ، وببساطة اكتشاف استراتيجية تخصيص عازلة معقولة.

نصائح أخرى

ال malloc() الوظيفة ، في المعيار C لم يتم الإعلان عنها في ""<malloc.h>"رأس. تم إعلانه في <stdlib.h>. الشيء نفسه بالنسبة ل realloc() و free().

لا أعرف عن C ++ ، ولكن بدلاً من

#include <cmalloc>

محاولة

#include <cstdlib>

جu003Clib> الذي يرفق تقريباu003Clib> .h في namespace std { }, ، هي ميزة قياسية من C ++. انظر الفقرة 17.4.1.2 إذا كان لديك إمكانية الوصول إلى أي من المعيار.

هذه ليست ميزة تجريبية على الإطلاق - ما هو ملف الرأس الذي يمنحك مشاكل التوافق؟

باستخدام Malloc et al. على ما يرام ، ولكن تأكد من عدم مزجها مع جديد/حذف. (على سبيل المثال لا delete أ malloc()"إد العازلة.)

هناك بعض من المعيار جu003Clib.h> الرؤوس التي لم يتم نقلها بعدu003Cclib> . ربما استخدمتu003Ccstdint> أو ما شابه في مكان ما.

مع المعيار الحالي ، لديك مكتبات C مدرجة هنا. لاحظ أنu003Ccstdint> هو ليس جزء منه.

لم أجد إشارة تصف إذا ومتىu003Ccstdint> سيكون جزءًا من C ++ ، ولكن إذا حاولت تضمينه ، فستحصل أيضًا على رسالة خطأ تخبرني أنه يجب علي استخدام -std = C ++ 0x ، لذلك أفترض أنه من المخطط أن يتم تضمينه في معيار C ++ التالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top