私の単純な C99 プロジェクトには、実装する必要があるインターフェース ( GObject interfacesを介して) を定義する外部 C ライブラリがあります。
void interface_function (const char *address, [...]);
さて、(私が書く必要がある)実装内で、別のライブラリから他の関数を呼び出す必要があります(そのため、それらを変更することはできません*address
)const
。
void some_api_function (char *address, [...]);
ここで、単純に に渡す*address
とsome_api_function
、コンパイラの警告が表示されます。
warning: passing argument 1 of ‘some_api_function’ discards ‘const’ qualifier from pointer target type [enabled by default]
char *
次のように関数呼び出しで明示的にキャストしようとしました:
`some_api_function ((char*) address, [...]) { ... }
しかし、その後、別の警告が表示されます。
warning: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Wcast-qual]
問題は、これが多くの人が取り組んでいる大規模な C プロジェクトであり、ポリシーが-Werror
有効になっており、コンパイル時に警告を発するコードがメインライン ソース コードに受け入れられないことです。
インターフェイスの定義はサードパーティなので変更できませんし、外部ライブラリのAPI定義も変更できません。私はそれ*address
が外部ライブラリで変更されていないことを知っています(それはconstかもしれませんが、私が言ったようにそれを変更することはできません)
const char*
また、この問題を解決するには、 intoのコピーを作成するだけでよいこともわかっていますchar *
が、不要なコピー操作が必要になるため、それは適切ではありません。
では、これを行うためのエレガントまたは「正しい」方法は何ですか?