আমি এমন একটি প্রকল্পে কাজ করছি যার প্রচুর উত্তেজনা সি কোড রয়েছে। আমরা শেষ পর্যন্ত উত্তরাধিকারের কোডটি রূপান্তর করার অভিপ্রায় দিয়ে সি ++ তে লেখা শুরু করেছি। সি এবং সি ++ কীভাবে ইন্টারঅ্যাক্ট করে সে সম্পর্কে আমি কিছুটা বিভ্রান্ত । আমি মোড়কে বুঝি যে সি মাধ্যমে কোডের extern "C"
সি ++ কম্পাইলার কাপড় ইস্ত্রী করা হবে না সি কোডের নাম, কিন্তু আমি সম্পূর্ণরূপে নিশ্চিত কিভাবে এই বাস্তবায়ন নই।
সুতরাং, প্রতিটি সি হেডার ফাইলের শীর্ষে (অন্তর্ভুক্ত গার্ডদের পরে), আমাদের আছে
#ifdef __cplusplus
extern "C" {
#endif
এবং নীচে, আমরা লিখুন
#ifdef __cplusplus
}
#endif
দুজনের মধ্যে, আমাদের আমাদের অন্তর্ভুক্ত, টাইপডেফস এবং ফাংশন প্রোটোটাইপস রয়েছে। আমি এগুলি সঠিকভাবে বুঝতে পারছি কিনা তা দেখতে আমার কয়েকটি প্রশ্ন রয়েছে:
যদি আমি একটি সি ++ ফাইল A.hh যা অন্তর্ভুক্ত আছে সি হেডার ফাইল BH রয়েছে আরেকটি সি হেডার ফাইল অধ্যায়, কিভাবে কাজ করে? আমি মনে করি যে সংকলকটি যখন ভাতে প্রবেশ
__cplusplus
করবে তখন সংজ্ঞায়িত হবে, সুতরাং এটি কোডটি মোড়ানো হবেextern "C"
(এবং__cplusplus
এই ব্লকের অভ্যন্তরে সংজ্ঞায়িত হবে না)। সুতরাং, যখন এটি সি এ পদক্ষেপ__cplusplus
নেবে, সংজ্ঞায়িত হবে না এবং কোডটি মোড়ানো হবে নাextern "C"
। এটা কি সঠিক?কোডের টুকরোটি মুড়িয়ে কোনও সমস্যা আছে কি
extern "C" { extern "C" { .. } }
? দ্বিতীয়টি কী করবেextern "C"
?আমরা এই মোড়কটি .c ফাইলের চারপাশে রাখি না, কেবলমাত্র .h ফাইলগুলি। সুতরাং, যদি কোনও ক্রিয়ায় প্রোটোটাইপ না থাকে তবে কী হবে? সংকলকটি কি এটি সি ++ ফাংশন বলে মনে করে?
আমরা কিছু তৃতীয় পক্ষের কোডও ব্যবহার করছি যা সি-তে লেখা থাকে এবং এর চারপাশে এই ধরণের মোড়ক নেই। যে কোনও সময় আমি সেই লাইব্রেরি থেকে একটি শিরোলেখ অন্তর্ভুক্ত করি, আমি
extern "C"
# অন্তর্ভুক্ত এর চারপাশে একটি রাখছি । এটি কি এটি মোকাবেলা করার সঠিক উপায়?অবশেষে, এটি কি একটি ভাল ধারণা সেট আপ? আমাদের আরও কিছু করা উচিত? আমরা অদূর ভবিষ্যতের জন্য সি এবং সি ++ মিশ্রিত করতে যাচ্ছি , এবং আমি নিশ্চিত করতে চাই যে আমরা আমাদের সমস্ত ঘাঁটি আবরণ করছি।
To ensure that the names declared in that portion of code have C linkage, and thus C++ name mangling is not performed.
(আমি এটি লিঙ্কটি থেকে পেয়েছি )