Linux (ve OS X) makinelerimde, iconv()
işlev şu prototipe sahiptir:
size_t iconv (iconv_t, char **inbuf...
FreeBSD'de şu şekilde görünür:
size_t iconv (iconv_t, const char **inbuf...
C ++ kodumun her iki platformda da oluşturulmasını istiyorum. C derleyicileriyle, char**
bir const char**
parametre için (veya tam tersi) geçmek tipik olarak yalnızca bir uyarı verir; ancak C ++ 'da bu ölümcül bir hatadır. Yani eğer char**
a'yı geçersem, BSD'de derlenmez ve eğer bir const char**
geçersem Linux / OS X'de derlenmez. Platformu tespit etmeye çalışmadan her ikisinde de derleyen kod yazabilirim?
Aklımdaki (başarısız) bir fikir, başlık tarafından sağlananları geçersiz kılan yerel bir prototip sağlamaktı:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
Bu başarısız olur çünkü iconv
C bağlantısına ihtiyaç vardır ve extern "C"
bir işlevin içine koyamazsınız (neden olmasın?)
Bulduğum en iyi çalışma fikri, işlev işaretçisini kendisinin atmasıdır:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
ancak bu daha ciddi hataları maskeleme potansiyeline sahiptir.