Как я могу переносимо вызвать функцию C++, которая принимает char **на одних платформах и const char **на других?

На моих машинах с 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);

но это может скрыть другие, более серьезные ошибки.

91
задан pb2q 10 July 2012 в 20:35
поделиться