В моем простом проекте C99 у меня есть внешняя библиотека C, которая определяет интерфейс (через интерфейсы GObject).), которые мне нужно реализовать:
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 char*
в char *
, но мне это кажется неправильным, поскольку требует ненужной операции копирования.
Итак, каков элегантный или «правильный» способ сделать это?