Как изменить аргумент «const» на «неконстантный» при вызове функции в C - PullRequest
1 голос
/ 10 марта 2019

У меня проблема, когда функция вызывается другими функциями.

Мои функции таковы:

void *table_lookup(const table *t) {
    ...
    //Here I want to call my other function. 
    table_remove(t);
    ...
}

void table_remove(table *t) {
    ...
}

Я получил предупреждение при компиляции. Проблема в том, что я не могу изменить тип аргумента.

Ответы [ 4 ]

1 голос
/ 10 марта 2019

Вы НЕ должны выбрасывать квалификатор const. Любая попытка впоследствии изменить значение, которое было квалифицировано const, вызывает Неопределенное поведение . См. C11 Standard - 6.7.3 Классификаторы типов (p6) .

Параметр table_lookup имеет значение const по определенной причине. Это позволяет компилятору оптимизировать использование t. Если вы отбрасываете const и пытаетесь изменить t, вы нарушаете свое обещание компилятору, что t не будет изменено.

Вместо этого вам следует провести рефакторинг своего кода, чтобы функция remove() вызывала внутри него table_lookup, чтобы получить указатель (предположительно) на узел, который вы хотите удалить. Затем удалите node. Не пытайтесь добавить remove() в table_lookup. Создайте новую функцию.

0 голосов
/ 10 марта 2019

Да, верно.это была плохая идея - отбросить const-квалификатор,Я не могу добавить новую функцию.((таблица) *) дает проблему.

0 голосов
/ 10 марта 2019

Вы можете отбросить квалификатор const: table_remove((table *)t);, но вы можете столкнуться с проблемами, если table_remove попытается изменить структуру table, например, если она хранится в чтении только сегмент.

Поэтому вы не должны делать это. Довольно неожиданно, что функция поиска все равно изменит таблицу. Если это происходит по уважительным причинам, таким как создание хеш-таблицы или поддержка кэша, аргумент не должен быть объявлен как const.

0 голосов
/ 10 марта 2019

В C вы можете напрямую использовать его для удаления свойства const.

void *table_lookup(const table *t)
//Here I want to call my other function. 
table_remove((table*)t)   // remove 'const' by directly casting.
...
return

void table_remove(table *t)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...