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