Указатель на функцию IAR (typedef void) - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю на STM8S с IAR Workbench.

Мой код

typedef     void    (*MyFunction)(); 

, и я получил следующие ошибки:

Ошибка [Pe513]: aЗначение типа «void (*) (u8)» нельзя присвоить объекту типа «MyFunction»

Я ищу в Интернете и нахожу образец для AVR, который я показываю ниже:

typedef void (*MyFunction)(void); 

Это также не работает.

Любая идея, чтобы исправить это.

1 Ответ

0 голосов
/ 29 ноября 2018

Чтобы указатели были назначаемыми, им нужно указывать на совместимые типы (а тип, на который указывает левая сторона, должен иметь все квалификаторы типа, на который указывает правая часть).См. 6.5.16.1p1 .

Предполагается, что u8 равно uint8_t АКА unsigned char, void () НЕ совместимо с void (u8).

6.7.6.3p15 (с выделением):

Для совместимости двух типов функций оба должны указывать совместимые типы возвращаемых данных.146) Кроме того, списки типов параметров, если присутствуют оба, должны согласовать количество параметров и использование терминатора многоточия;соответствующие параметры должны иметь совместимые типы. Если один тип имеет список типов параметров, а другой тип указывается декларатором функции, который не является частью определения функции и который содержит пустой список идентификаторов, список параметров не должен иметь терминатора с многоточием и типакаждый параметр должен быть совместим с типом, который получается в результате применения аргументов по умолчанию. Если у одного типа есть список типов параметров, а другой тип определен в определении функции, которое содержит (возможно, пустой) список идентификаторов,оба должны согласовывать количество параметров, а тип каждого параметра-прототипа должен быть совместим с типом, который получается в результате применения продвижений аргументов по умолчанию к типу соответствующего идентификатора.(При определении совместимости типов и составного типа каждый параметр, объявленный с типом функции или массива, принимается как имеющий скорректированный тип, а каждый параметр, объявленный с квалифицированным типом, принимается как имеющий неквалифицированную версию своего объявленного типа.)

Несовместимость связана с рекламной акцией.Типы символов повышаются до int, поэтому в то время как вы могли бы:

(void(*)()){0}=(void(*)(int)){0};
(void(*)(int)){0}=(void(*)()){0};

делать то же самое с u8 / unsigned char недопустимо:

(void(*)()){0}=(void(*)(unsigned char)){0}; //error
(void(*)(unsigned char)){0}=(void(*)()){0}; //error 

Вам необходимо сделатьtypedef должно быть точно void (*)(u8), либо вам нужно изменить сигнатуру целевой функции на void (int) (или void (unsigned)), либо вам нужно привести указатель функции.(Обратите внимание, что указатели на функции свободно взаимозаменяемы, но перед вызовом функции необходимо привести их к нужному типу).

...