সি কোডে সি ++ লাইব্রেরি ব্যবহার করা


103

আমার কাছে একটি সি ++ গ্রন্থাগার রয়েছে যা ডেটা পরিচালনা করার জন্য বিভিন্ন ক্লাস সরবরাহ করে। আমার কাছে লাইব্রেরির উত্স কোড রয়েছে।

আমি সি ফাংশন কলগুলি সমর্থন করতে সি ++ এপিআই প্রসারিত করতে চাই যাতে গ্রন্থাগারটি একই সাথে সি কোড এবং সি ++ কোডের সাথে ব্যবহার করা যায়।

আমি জিএনইউ সরঞ্জাম চেইন (জিসিসি, গ্লিবসি, ইত্যাদি) ব্যবহার করছি, সুতরাং ভাষা এবং আর্কিটেকচার সমর্থন কোনও সমস্যা নয়।

প্রযুক্তিগতভাবে এটি সম্ভব না হওয়ার কোনও কারণ রয়েছে কি ?

থেকে থাকে gotcha এ আমি জন্য সতর্ক দরকার?

এর সাথে কি সম্পদ, উদাহরণ কোড এবং / অথবা ডকুমেন্টেশন উপলব্ধ?


আরও কিছু জিনিস যা আমি জানতে পেরেছি:

  1. আপনার সি ++ শিরোনামগুলি মোছার জন্য নিম্নলিখিতটি ব্যবহার করুন যা সি কোড দ্বারা ব্যবহার করা দরকার।

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. সি দ্বারা অন্তর্ভুক্ত নেই এমন পৃথক শিরোনাম ফাইলগুলিতে "আসল" সি ++ ইন্টারফেস রাখুন পিএমপিএল নীতিটি এখানে ভাবুন । #ifndef __cplusplus #errorস্টাফ ব্যবহার করা যেকোন উন্মত্ততা সনাক্ত করতে এখানে সহায়তা করে।
  2. সি কোডে নাম হিসাবে সি ++ শনাক্তকারীদের যত্নবান
  3. সি এবং সি ++ সংকলকগুলির মধ্যে আকারে পৃথক এনামগুলি। আপনি যদি জিএনইউ সরঞ্জাম চেইন ব্যবহার করছেন তবে সম্ভবত কোনও সমস্যা নয় তবে সতর্কতা অবলম্বন করুন।
  4. স্ট্রাইকগুলির জন্য নিম্নলিখিত ফর্মটি অনুসরণ করুন যাতে সি বিভ্রান্ত না হয়।

    typedef struct X { ... } X
    
  5. তারপরে সি ++ অবজেক্টগুলির কাছাকাছি যাওয়ার জন্য পয়েন্টারগুলি ব্যবহার করুন, সেগুলি কেবলমাত্র স্ট্রাক্ট এক্স হিসাবে সিতে ঘোষণা করতে হবে যেখানে এক্স হ'ল সি ++ অবজেক্ট।

এই সমস্ত কিছুই বন্ধুর সৌজন্যে যিনি সি ++ এ উইজার্ড।


4
কিছুটা দেরি হয়ে গেছে, তবে আমি সি ++ এর জন্য সি র‌্যাপার সম্পর্কে একটি ছোট হাটো লিখেছি
টেডি

উত্তর:


69

হ্যাঁ, এটি অবশ্যই সম্ভব। আপনাকে সি ++ তে একটি ইন্টারফেস স্তর লিখতে হবে যা এর সাথে ফাংশনগুলি ঘোষণা করে extern "C":

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

তারপরে, আপনি foo()আপনার সি মডিউল থেকে কল করবেন , যা realFoo()সি ++ এ প্রয়োগ করা ফাংশনে কলটি পাঠিয়ে দেবে।

যদি আপনাকে ডেটা সদস্য এবং পদ্ধতিগুলির সাথে একটি সম্পূর্ণ সি ++ শ্রেণি প্রকাশ করতে হয় তবে আপনার এই সাধারণ ফাংশন উদাহরণের চেয়ে আরও বেশি কাজ করতে হতে পারে।


করা উচিত extern "C"শুধুমাত্র ঘোষণা স্থাপন করা (এবং সংজ্ঞা নেই)? কারণ আপনি "স্তরটি ফাংশন ঘোষণা করে" উল্লেখ করেছেন তবে আপনার নমুনা কোডটিও একটি সংজ্ঞা। অন্য কথায়, আমরা কি এটি হেডার ফাইলগুলিতে বা উত্স ফাইলগুলিতে স্থাপন করতে পারি? (বা উভয়?)
kyriakosSt

@ কায়ারস্টেস্ট: যদি ফাংশন ঘোষণার সাথে যদি আপনার একটি শিরোনাম ফাইল থাকে তবে আপনাকে কমপক্ষে extern "C"সেখানে রাখতে হবে। আপনার সংকলক আপনাকে জানাতে হবে যে আপনি এটি সংজ্ঞাতে রাখতে চান কিনা।
গ্রেগ হিউগিল

23

সি ++ এফএকিউ লাইট: "সি এবং সি ++ কোড কীভাবে মিশ্রিত করতে হয়"

কিছু প্রশ্নের উত্তর এই প্রশ্নের উত্তরে বর্ণিত হয়েছে:

  • [32.8] আমি কীভাবে একটি সি ফাংশনটিতে / থেকে সি ++ শ্রেণির কোনও অবজেক্ট পাস করতে পারি?
  • [32.9] আমার সি কাজটি কি কোনও সি ++ শ্রেণীর কোনও অবজেক্টে সরাসরি ডেটা অ্যাক্সেস করতে পারে?

12

মূল গোচা: ব্যতিক্রমগুলি সি তে ধরা যাবে না যদি সি ++ কোডে কোনও ব্যতিক্রম বাড়ার সম্ভাবনা থাকে তবে হয় আপনার সি কোড বা আপনার সি ++ র‌্যাপারগুলি খুব সাবধানতার সাথে লিখুন। বিপরীতভাবে, সি কোডে মেকানিজম (যেমন লংজাম্প) এর মতো ব্যতিক্রম (বিভিন্ন স্ক্রিপ্টিং ভাষায় পাওয়া যায়) স্ট্যাকের সি ++ অবজেক্টের জন্য ডেস্ট্রাক্টরদের অনুরোধ করার প্রয়োজন নেই।


4
লংজাম্প কল সম্পর্কে দুর্দান্ত পয়েন্ট। আমি যখন এগুলি সরাসরি ব্যবহার না করি, আমি যে পরীক্ষামূলক ফ্রেমওয়ার্কগুলি ব্যবহার করি সেগুলি সেগুলি বাস্তবায়ন করে। কিছু মনে রাখবেন। ধন্যবাদ
মিশা এম

3

আপনি সি / সি ++ কোড মিশ্রণ করতে পারেন। যদি আপনার মূল () ফাংশন সি ++ এ থাকে তবে আপনাকে কেবল আপনার সি ফাংশনগুলি ঘোষিত হয়েছে তা নিশ্চিত করতে হবে

extern "C"

যদি আপনার মূল সি হয়, তবে আপনি সম্ভবত স্থির ভেরিয়েবলগুলি বাদ দিচ্ছেন OK আপনার স্ট্যাটিক ভেরিয়েবলগুলির সাথে যে কোনও কনস্ট্রাক্টরকে মূল () শুরু করার আগে ডাকা হবে। সি আপনার প্রধান হলে এটি হবে না। আমার আপনার কাছে প্রচুর স্ট্যাটিক ভেরিয়েবল রয়েছে, করণীয় হ'ল সিংটলেটনের সাথে স্থির ভেরিয়েবলগুলি প্রতিস্থাপন করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.