我正在使用IAR Workbench开发STM8S。
我的代码
typedef void (*MyFunction)();
我得到了这些错误:
错误[Pe513]:无法将类型“ void(*)(u8)”的值分配给 类型为“ MyFunction”的实体
我在网上搜索,然后找到下面显示的AVR示例:
typedef void (*MyFunction)(void);
它也不起作用。
任何修复它的想法。
答案 0 :(得分:2)
要使指针可分配,它们需要指向兼容类型(并且左侧指向的类型需要具有右侧指向的所有类型的限定符)。参见6.5.16.1p1。
假设u8
等于uint8_t
unsigned char
,则void ()
与void (u8)
不兼容。
6.7.6.3p15(重点):
要使两种功能类型兼容,两者均应规定兼容 146)此外,如果参数类型列表都是 目前,应在参数数量和使用 省略号终止符;对应参数应兼容 类型。 如果一种类型具有参数类型列表,而另一种类型是 由不属于函数的函数声明符指定 定义,其中包含一个空的标识符列表,该参数 列表中不应包含省略号和每个类型 参数应与由 缺省参数Promotions的应用程序。如果一种类型具有 参数类型列表,其他类型由函数指定 定义包含(可能为空)标识符列表,两者 应在参数数量和每个参数的类型上达成一致 原型参数应与结果类型兼容 从默认参数提升的应用到类型 相应的标识符。 (在确定类型 兼容性和复合类型,每个参数都用 函数或数组类型被视为具有调整后的类型,并且每个 以限定类型声明的参数被视为具有 声明类型的非限定版本。)
不兼容是由于促销的原因。字符类型将提升为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)
),或者需要强制转换函数指针。 (请注意,函数指针可以自由地相互广播,但是在调用函数之前,您必须将其转换为正确的类型。)