سؤال

يقول دليل Python أنه يمكنك إنشاء وحدات ل Python في كل من C و C ++. يمكنك الاستفادة من أشياء مثل الفصول والقوالب عند استخدام C ++؟ لن يخلق عدم توافق مع بقية المكتبات ومع مترجم شفوي؟

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

المحلول

لا يهم ما إذا كان تنفيذ وظائف الخطاف يتم تطبيقه في C أو في C ++. في الواقع، رأيت بالفعل بعض ملحقات الثعبان التي تجعل الاستخدام النشط لقوالب C ++ وحتى مكتبة دفعة. لا مشكلة. :-)

نصائح أخرى

تحتوي الناس على تعزيز طريقة آلية لطيفة للقيام بتفويل رمز C ++ للاستخدام من قبل Python.

يطلق عليه: Boost.Python

يتعامل مع بعض بنيات C ++ أفضل من Swig، ولا سيما Metaprogramming القالب.

ما كنت مهتما هو برنامج يسمى جرعة كبيرة. وبعد سيؤدي ذلك إلى توليد مغريات الثعبان والواجهات للحصول على رمز C ++. أستخدمها مع القوالب والميراث وأسماء الأسماء وما إلى ذلك. ويعمل بشكل جيد.

يجب أن تكون قادرا على استخدام جميع ميزات لغة C ++. ال تمديد وثائق بيثون (2.6.2) يقول أنه يمكنك استخدام C ++، ولكن يذكر تحذيرات المتابعة:

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

لا يمكن القيام بالتقييد الأول أو "الكائنات العالمية أو الثابتة مع منشئين"، بالطريقة التي تهيئة compiler c ++ c ++ كائنات مع هذا النوع من مدة التخزين. على سبيل المثال، النظر في التعليمات البرمجية التالية:

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

يتعين على المترجم أن ينبعث من التعليمات البرمجية الخاصة بحيث يتم استدعاء منشئ "FOO" ل "F" قبل تنفيذ Main. إذا كان لديك كائنات مع مدة تخزين ثابتة في ملحق Python الخاص بك و لا يتم تجميع مترجم Python وربطه ل C ++، ثم لن يتم إنشاء رمز التهيئة الخاص هذا.

التقييد الثاني، "الوظائف التي سيتم استدعاؤها بواسطة مترجم الثعبان (على وجه الخصوص، وظائف تهيئة الوحدة النمطية) يجب أن يتم الإعلان عنها خارجية" C ""، يجب أن تفعل مع C ++ Name Mangling. معظم مترجم C ++ Mange أسمائهم حتى يتمكنوا من استخدام نفس الرصم المتوفر لمجموعة أدوات C. على سبيل المثال يقول أنه كان لديك:

void a_function_python_calls(void* foo);

قد يقوم برنامج التحويل البرمجي C ++ بتحويل المراجع إلى اسم "a_function_python_calls" إلى شيء مثل "A_Function_python_calls @ 1VGA". في هذه الحالة، قد تحصل على خارجي لم يتم حلها عند محاولة الارتباط بمكتبة Python.

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