আমার লিনাক্স (এবং ওএস এক্স) মেশিনে, iconv()
ফাংশনটির এই প্রোটোটাইপ রয়েছে:
size_t iconv (iconv_t, char **inbuf...
ফ্রিবিএসডি থাকাকালীন এটিকে দেখতে দেখতে এমন দেখাচ্ছে:
size_t iconv (iconv_t, const char **inbuf...
আমি উভয় প্ল্যাটফর্মে আমার সি ++ কোড তৈরি করতে চাই। সি সংকলকগুলির সাথে, char**
একটি const char**
প্যারামিটারের জন্য একটি পাস (বা বিপরীতে) সাধারণত একটি নিছক সতর্কতা প্রকাশ করে; তবে সি ++ এ এটি মারাত্মক ত্রুটি। সুতরাং আমি যদি পাস করি তবে char**
এটি বিএসডি-তে সংকলন করবে না এবং আমি যদি পাস করি তবে const char**
এটি লিনাক্স / ওএস এক্স-এ সংকলিত হবে না the প্ল্যাটফর্মটি সনাক্ত করার চেষ্টা না করে আমি কীভাবে উভয়কে সংকলিত কোড লিখতে পারি?
আমার একটি (ব্যর্থ) ধারণা ছিল একটি স্থানীয় প্রোটোটাইপ সরবরাহ করা যা শিরোলেখ দ্বারা প্রদত্ত যে কোনওটিকে ওভাররাইড করে:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
এটি ব্যর্থ হয়েছে কারণ iconv
সি লিঙ্কেজ প্রয়োজন, এবং আপনি extern "C"
কোনও ফাংশনের মধ্যে রাখতে পারবেন না (কেন নয়?)
আমি যে সর্বোত্তম কার্যকরী ধারণা নিয়ে এসেছি তা হ'ল ফাংশন পয়েন্টারটি নিজেই কাস্ট করা:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
তবে এটিতে আরও গুরুতর ত্রুটিগুলি মাস্ক করার সম্ভাবনা রয়েছে।