函数指针IAR(typedef void)

时间:2018-11-29 14:35:26

标签: c compiler-errors iar

我正在使用IAR Workbench开发STM8S。

我的代码

typedef     void    (*MyFunction)(); 

我得到了这些错误:

  

错误[Pe513]:无法将类型“ void(*)(u8)”的值分配给   类型为“ MyFunction”的实体

我在网上搜索,然后找到下面显示的AVR示例:

typedef void (*MyFunction)(void); 

它也不起作用。

任何修复它的想法。

1 个答案:

答案 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 

您需要使typedefvoid (*)(u8)完全相同,或者需要将目标函数的签名更改为void (int)(或void (unsigned)),或者需要强制转换函数指针。 (请注意,函数指针可以自由地相互广播,但是在调用函数之前,您必须将其转换为正确的类型。)