Указан класс хранения ошибок в указателях функций C для параметра `имя типа '
В настоящее время у меня есть кусок кода, над которым я работаю, используя указатели функций в качестве обратных вызовов. У меня возникла проблема с ошибкой из gcc о том, что "класс хранения указан для параметра` имя типа '". Соответствующая часть кода:
error_t addCommand(uint8_t command, void (*callback)(uint16_t,uint8_t)){
Это на самом деле использует язык nesC для TinyOS, но, похоже, это проблема Си. В своих исследованиях по этой проблеме я нашел предложения, в основном вытекающие из одной из двух проблем:
- Что-то не так в заголовке (отсутствует точка с запятой)
- Передача указателя функции со статическим или переменным значением (т.е.
void (*callback)(volatile int, uint8_t)
Насколько я могу судить, я устранил проблему 1. Проблема 2 является проблемой только в том случае, если uint16_t
или же uint8_t
статичны волатильны (у меня нет большого опыта с этими типами). Любые советы / ответы о том, как решить эту проблему, с благодарностью.
Также, если кто-то знаком с nesC, точный код выглядит примерно так:
command error_t CommandEngine.addCommand(uint8_t command,
void (*callback)(uint16_t,uint8_t)) {
Возможно, что то, что nesC добавляет к языку C, вызывает эту ошибку, но я не думаю, что это так.
РЕДАКТИРОВАТЬ: Это было NESC, в некотором смысле. Оказывается, я дебил и использовал команду в качестве имени переменной, когда команда используется nesC и преобразована в какой-то блок кода C перед компиляцией. Спасибо всем за идею преобразования его в код на C, так как это заставило меня осознать проблему. Я действительно должен был подумать об этом.
1 ответ
Обычно полезно использовать typedef для указателей на функции. Это может решить вашу проблему, и, несомненно, будет гораздо более читабельным:
typedef void (*callback_t)(uint16_t,uint8_t);
error_t addCommand(uint8_t command, callback_t callback)){
Если это не решит проблему, то, по крайней мере, сузит ее - вы увидите, связана ли проблема с typedef или функцией.
Вы также должны попытаться выяснить, является ли это nesC (о котором я ничего не знаю) или C. Попробуйте удалить определенные части nesC и скомпилировать с помощью gcc, и посмотрите, что произойдет.