【问题标题】:Large unexpected u16_t buf大出乎意料的 u16_t buf
【发布时间】:2014-09-19 16:58:35
【问题描述】:

我有一个调用函数指针的 C 函数(带有指向 buf 的指针和 buf 的大小)

printf("------------------------------\n");
printf("lengh of DATA_output = %zu\n", p->tot_len);
(*myStr.OnSendData)(buf, p->tot_len);
printf("------------------------------\n");

指向函数定义的指针

typedef void (*pOnSendData)(void *buf, u16_t len);

然后我真正的 c++ 类方法通过那个指针得到它:

void Someclass::myPOnSendData(void *buf, u16_t len) {
std::cout << " Someclass::mypOnSendData len = " << (int)len << std::endl;
//Do something
}

问题在于buf 中的len 相当大。

输出是:

------------------------------
lengh of DATA_output = 42
------------------------------

Someclass::myPOnSendData len = 50512

怎么可能?

【问题讨论】:

  • 为什么人们仍然认为 C/C++ 是一门语言?
  • @ValentinMercier 在我头上。如果不是语言,什么是 C/C++?
  • void (*)(void *, size_t)void (*)(void *, u16_t) 不兼容
  • 对不起,两者都是 u16_t 。已修复
  • @Fiddling,C 和 C++ 不是同一种语言,而且从来都不是:从第一天起,就有 C++ 编译器无法编译的有效 C 程序,显然反之亦然。

标签: c++ c pointers c-libraries


【解决方案1】:

您说myPOnSendData 不是静态成员函数,但您正试图将指向它的指针分配给C 函数指针。这不起作用,因为指向函数的 C 样式指针不支持非静态成员函数。

如果你把函数改成静态的,它将与指针类型兼容。

请注意,由于当前类型不兼容,因此在尝试分配函数指针时可能会收到错误消息,并且必须执行强制转换才能绕过它。不要这样做,因为你只是隐藏错误而不是解决它。

【讨论】:

    猜你喜欢
    • 2014-09-11
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2018-07-14
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多