Na moich komputerach z systemem Linux (i OS X) iconv()
funkcja ma następujący prototyp:
size_t iconv (iconv_t, char **inbuf...
podczas gdy we FreeBSD wygląda to tak:
size_t iconv (iconv_t, const char **inbuf...
Chciałbym, aby mój kod C ++ był budowany na obu platformach. W kompilatorach C, przekazanie parametru char**
a const char**
(lub odwrotnie) zazwyczaj generuje zwykłe ostrzeżenie; jednak w C ++ jest to błąd krytyczny. Więc jeśli zdam char**
, nie będzie kompilował się na BSD, a jeśli zdam, const char**
nie będzie się kompilował w systemie Linux / OS X. Jak mogę napisać kod, który kompiluje się na obu, bez uciekania się do próby wykrycia platformy?
Jeden (nieudany) pomysł, jaki miałem, polegał na dostarczeniu lokalnego prototypu, który zastąpi wszystkie podane w nagłówku:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
To się nie udaje, ponieważ iconv
wymaga połączenia C i nie możesz wstawić extern "C"
funkcji (dlaczego nie?)
Najlepszym działającym pomysłem jest rzutowanie samego wskaźnika funkcji:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
ale może to maskować inne, poważniejsze błędy.