错误-<功能声明=“”>不是指向兼容类型的指针

时间:2019-03-26 17:13:22

标签: c

我的代码中有3个函数:

#pragma Code(".my_functions")
    int  func_A(volatile ulong *from, volatile ulong *to, ulong size) {...}
    int  func_B(uint32_t *buf_src, int size) {...}
    void func_C(int size, uint32_t *buf) {...}
#pragma Code()

在此文件的另一个函数中,我需要计算func_Afunc_B的大小:

int calc_size()
{
        // End address of B (== start of C) - Start address of A:
        int funcs_size = func_C - func_A; // Here the error

        // ...
}

我收到下一个编译错误:

error: 'void (*)(int, uint32_t *)' (aka 'void (*)(int, unsigned int *)') and 'int (*)(volatile ulong *, volatile ulong *, ulong)' (aka 'int (*)(volatile unsigned long *, volatile unsigned long *, unsigned long)') are not pointers to compatible types

注意:我可以通过强制转换函数指针来解决错误,例如:

int funcs_size = (void*)func_C - (void*)func_A; 

但是相同大小的计算对于其他功能(也具有不同的类型)非常适合。

您知道什么时候可以使用函数指针进行此类计算,为什么在此特定示例中出现编译错误?

谢谢您的帮助

2 个答案:

答案 0 :(得分:2)

  

我需要计算func_A和func_B的大小:

     

[...]

        // End address of B (== start of C) - Start address of A:
        int funcs_size = func_C - func_A; // Here the error

C没有任何关于函数大小的概念,也没有任何标准方法来计算与该统计量有关的任何事情。

  

我收到下一个编译错误:

     

error: 'void (*)(int, uint32_t *)' (aka 'void (*)(int, unsigned int *)') and 'int (*)(volatile ulong *, volatile ulong *, ulong)' (aka 'int (*)(volatile unsigned long *, volatile unsigned long *, unsigned long)') are not pointers to compatible types

那是您的代码中的错误。不过,我认为它更像是一条红鲱鱼。对象指针的指针算术是根据指向类型的大小定义的,因此未为不兼容类型的指针定义。函数指针的类型包含其返回类型以及参数的类型(如果已指定),因此即使我们认为您的函数指针是对象指针,它们的类型也不兼容,因此不允许进行减法运算。 / p>

  

注意:我可以通过强制转换函数指针来解决错误,例如:

int funcs_size = (void*)func_C - (void*)func_A; 

这取决于您的编译器实现的三个独立扩展:

  • 将函数指针转换为对象指针,
  • 计算类型为void *的指针之间的差,并且
  • 计算指向不是同一数组的两个成员的对象的指针之间或指向数组末尾的位置之间的差。

就标准而言,没有一个定义行为。

  

但是相同大小的计算非常适合其他功能(类型也不同)

由于我们正在处理语言扩展,因此很难说出您的编译器可能接受或不接受什么。但是,我注意到,不同参数类型与 incompatible 参数类型不是同一回事,同样,不同的函数类型也不一定是不兼容的。因此,我推测您的编译器可能会接受针对兼容函数类型(作为扩展名)的指针的差异操作。

  

你知道什么时候可以使用函数指针   计算

这取决于您所说的“确定”。如果您试图编写符合语言标准的代码,那永远是不可能的。您可能无法计算函数指针之间的差异。您不得将函数指针转换为对象指针,以计算它们之间的差。

可以将函数指针转换为整数并计算其差,但是转换结果是实现定义的,因此不能保证有任何整数类型可以表示没有数据的转换后的函数指针损失。

无论如何,无论是计算指针差还是整数差,都完全不确定该差的含义。即使我们假设从而计算出一个函数的起始地址与另一个函数的起始地址之间的差,相对于一些常见的线性地址空间,也无法保证函数的排列方式在内存中-与它们的相对顺序无关,与它们的连续性无关,与填充或对齐无关,

答案 1 :(得分:0)

  

我需要计算func_Afunc_B的大小

如果您想要更有用的答案,则可能需要重新评估需要的内容,或者在此处编辑问题以提供一些理由。

  

您知道何时可以使用函数指针进行此类计算

在没有任何迹象表明您正在使用哪个平台的情况下,我们必须假设您正在谈论C抽象机,在这种情况下,那永远都不行。

  

为什么在此特定示例中出现编译错误?

因为在这种情况下,编译器遵循该标准,并且还可以帮助您了解该标准。