назначить func (const void *) для func (void *) в C - PullRequest
2 голосов
/ 29 сентября 2011

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

void applyList(List *, void applyFunc(void *));

Теперь я хочу предоставить функцию, которая печатает элемент в списке.Поскольку я не изменяю элемент списка, функция печати выглядит следующим образом:

void printNode(const void *nodeData){
    Data *dPtr=(Data*)nodeData;
    printf("%s", dPtr->str );
}

//Usage
applyList(list, printNode);

Однако я получил ошибку компилятора, говорящую

expected ‘void (*)(void *)’ but argument is of type ‘void (*)(const void *)’

Я не хочу добавлять const к apply прототипу, потому что я мог бы предоставить некоторую функцию, которая изменяет данные.Любое предложение о том, как справиться с этой ситуацией?

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

К сожалению, в C указатели на функции не являются полиморфными. Совсем. Попытка вызвать приведение приводит к неопределенному поведению.

Ваш единственный стандартный выход - написать функцию-обертку:

static void wrap_printNode(void *nodeData) {
  printNode(nodeData);
}

Обратите внимание, однако, что ваш const здесь бесполезен:

Data *dPtr=(Data*)nodeData;

Вы только что отбросили декларацию const. Постарайся сохранить это там:

const Data *dPtr=(const Data*)nodeData;
0 голосов
/ 29 сентября 2011

Попробуйте это

applyList(list, (void(*)(void*)) printNode);
0 голосов
/ 29 сентября 2011

Я не хочу добавлять const к прототипу apply, потому что я мог бы предоставить некоторую функцию, которая изменяет данные.

Тогда нет разумного решения,Данные не могут быть изменены вами, поэтому они помечены const.

...