一部のプラットフォームではchar **を使用し、他のプラットフォームではconst char **を使用するC ++関数を移植可能に呼び出すにはどうすればよいですか?
私の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**パラメータに(またはその逆に)を渡すと、通常、単なる警告が発生します。ただし、C ++では致命的なエラーです。したがって、を渡した場合char**、BSDでコンパイルされません。渡した場合const char**、Linux / OS Xでコンパイルされません。プラットフォームを検出せずに、両方でコンパイルするコードを作成するにはどうすればよいですか? 私が持っていた1つの(失敗した)アイデアは、ヘッダーによって提供されたものをオーバーライドするローカルプロトタイプを提供することでした。 void myfunc(void) { size_t iconv (iconv_t, char **inbuf); iconv(foo, ptr); } これは、iconvCリンケージが必要なために失敗extern "C"し、関数内に配置することはできません(なぜでしょうか) 私が思いついた最良のアイデアは、関数ポインタ自体をキャストすることです。 typedef void (*func_t)(iconv_t, const char **); ((func_t)(iconv))(foo, ptr); しかし、これは他のより深刻なエラーを隠す可能性があります。