Di mesin Linux (dan OS X) saya, iconv()
fungsinya memiliki prototipe ini:
size_t iconv (iconv_t, char **inbuf...
sedangkan di FreeBSD terlihat seperti ini:
size_t iconv (iconv_t, const char **inbuf...
Saya ingin kode C ++ saya dibuat di kedua platform. Dengan kompiler C, melewati char**
untuk const char**
parameter (atau sebaliknya) biasanya memancarkan peringatan belaka; namun di C ++ ini adalah kesalahan fatal. Jadi, jika saya lulus a char**
, itu tidak akan dapat dikompilasi di BSD, dan jika saya meneruskannya const char**
tidak akan dapat dikompilasi di Linux / OS X. Bagaimana saya bisa menulis kode yang mengkompilasi keduanya, tanpa harus mencoba mendeteksi platformnya?
Satu ide (gagal) yang saya miliki adalah menyediakan prototipe lokal yang menggantikan apa pun yang disediakan oleh tajuk:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
Ini gagal karena iconv
membutuhkan tautan C, dan Anda tidak dapat memasukkan extern "C"
fungsi (mengapa tidak?)
Ide kerja terbaik yang saya temukan adalah dengan menggunakan penunjuk fungsi itu sendiri:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
tapi ini berpotensi menutupi kesalahan lain yang lebih serius.