Не используйте параметр командной строки: предупреждение говорит о том, что ваш код не является const-safe.Правильно, ваш код не const-safe, хотя это вина любого, кто написал библиотеку, которую вы используете.
Если вы отключите предупреждения, вы их не получитебольше, даже если вы пишете небезопасный код, и он является вашей ошибкой.
Вместо этого всякий раз, когда одна из библиотечных функций принимает указатель на non-const, но гарантирует не изменятьссылку на указатель, затем отбросьте константу от вашего указателя и передайте ее.Приведение служит записью в коде, который вы (программист) утверждаете, что ничего недействительного не произойдет, даже если система типов не может этого доказать и, вероятно, должна быть прокомментирована.
Например:
// in this library
void print_int(int *p) { printf("%d\n", *p); }
void set_int(int *p) { *p = 6; }
// your code
const int n = 5;
print_int((int*)(&n)); // warning suppressed for this call only,
// having carefully checked the print_int docs.
// further down your code
set_int(&n); // You *want* the compiler to stop this!
Или, если вас это беспокоит (потому что у вас много таких вызовов), напишите обертки для нарушающих функции библиотеки:
void print_int_const(const int *p) { print_int((int*)(p)); }
// but no wrapper for set_int
Помните, что приведение также удаляет volatile
(и вообще принимает много неверных вводов).Перегрузка предотвращает случайное использование совершенно неправильного типа, в то время как приведение на месте - нет.