На моих машинах Linux (и OS X) функция iconv()
имеет этот прототип:
size_t iconv (iconv_t, char **inbuf...
а во FreeBSD он выглядит так:
size_t iconv (iconv_t, const char **inbuf...
Я бы хотел, чтобы мой код на С++ работал на обеих платформах. С компиляторами C передача параметра char**
для параметра const char**
(или наоборот) обычно выдает простое предупреждение; однако в С++ это фатальная ошибка. Поэтому, если я передаю char**
, он не будет компилироваться в BSD, и если я передам const char**
, он не будет компилироваться в Linux/OS X. Как я могу написать код, который компилируется на обоих, не прибегая к попыткам определить платформу?
Одна (неудачная) идея, которую я имел, заключалась в том, чтобы предоставить локальный прототип, который переопределяет любой, предоставленный заголовком:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
Это не удается, потому что iconv
требуется C-связь, и вы не можете поместить extern "C"
внутри функции (почему бы и нет?)
Лучшей рабочей идеей, которую я придумал, является использование самого указателя функции:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
но это может маскировать другие, более серьезные ошибки.