На моих машинах с Linux (и OS X) iconv()
функция имеет этот прототип:
size_t iconv (iconv_t, char **inbuf...
а на FreeBSD это выглядит так:
size_t iconv (iconv_t, const char **inbuf...
Я бы хотел, чтобы мой код C ++ работал на обеих платформах. В компиляторах C передача a char**
для const char**
параметра (или наоборот) обычно вызывает простое предупреждение; однако в C ++ это фатальная ошибка. Так что, если я передаю 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);
но это может замаскировать другие, более серьезные ошибки.