मेरे लिनक्स (और OS X) मशीनों पर, iconv()
फ़ंक्शन में यह प्रोटोटाइप है:
size_t iconv (iconv_t, char **inbuf...
FreeBSD के दौरान ऐसा दिखता है:
size_t iconv (iconv_t, const char **inbuf...
मैं अपने C ++ कोड को दोनों प्लेटफार्मों पर बनाना चाहूंगा। सी संकलक के साथ, char**
एक const char**
पैरामीटर (या इसके विपरीत) के लिए गुजरना आम तौर पर एक मात्र चेतावनी का उत्सर्जन करता है; हालाँकि C ++ में यह एक घातक त्रुटि है। इसलिए यदि मैं पास करता हूं char**
, तो यह बीएसडी पर संकलित नहीं करेगा, और यदि मैं const char**
इसे पास करता हूं तो यह लिनक्स / ओएस एक्स पर संकलित नहीं होगा। मैं प्लेटफ़ॉर्म का पता लगाने की कोशिश किए बिना, दोनों पर संकलित कोड कैसे लिख सकता हूं?
एक (असफल) विचार मुझे एक स्थानीय प्रोटोटाइप प्रदान करना था जो हेडर द्वारा प्रदान किए गए किसी भी ओवरराइड करता है:
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);
लेकिन इसमें अन्य, अधिक गंभीर त्रुटियों को मुखौटा करने की क्षमता है।
iconv
को inbuf
गैर-कॉन्स्टेबल होने की आवश्यकता है ।
iconv
बिना जाहिरा तौर पर पहले से ही है const
: svnweb.freebsd.org/base/stable/9/include/…