【问题标题】:C++ cast pointer to static methodC++ 将指针转换为静态方法
【发布时间】:2011-11-17 17:15:05
【问题描述】:

我好久没写C++代码了;但是现在我必须在德州仪器 F28335 DSP 上工作,并且我正在尝试从 C 迁移到 C++。 我有以下代码尝试使用类的静态方法初始化中断服务例程:

//type definition for the interrupt service routine
typedef interrupt void (*PINT)(void);
//EPWMManager.h
class EPWMManager
{
public:
    EPWMManager();      
    static interrupt void Epwm1InterruptHandler(void);  
};
//EPWMManager.cpp
interrupt void EPWMManager::Epwm1InterruptHandler(void)
{
 //some code to be called on interruption
}   
//main.cpp
int main(void)
{
    PINT p;
    p = &(EPWMManager::Epwm1InterruptHandler);
    return 0;
 }

编译时我得到以下信息:

错误:“void (*)()”类型的值不能分配给“PINT”类型的实体

我想我错过了一些演员表。

【问题讨论】:

  • interrupt 关键字不是 C++ 的一部分。它必须是特定于您的实现的扩展。如果从PINTEpwm1InterruptHandler 的定义中删除它会发生什么?您仍然收到错误消息吗?
  • 根据我的经验,用于 DSP 处理器的 TI 编译器的质量即使对于 C 也并不令人印象深刻(例如,我们在页面处理边界情况下的代码生成器错误中反弹了不止一次)。您确定迁移到像 C++ 这样更复杂的语言是个好主意吗?
  • 如果我把'中断'去掉,错误就出来了......但是我不确定它的含义。我认为迁移到 C++ 将是一个好主意,因为我们的 C 代码开始看起来非常混乱,以便让所有内容(类、对象、设计模式等)更加结构化。

标签: c++ methods static compiler-errors interrupt


【解决方案1】:

我认为根本问题是 & 号将您分配的 RHS 前缀为 p。此外,“PINT”在其他操作系统中是“指向整数的指针”。因此,让我们避免任何潜在的名称冲突。但我认为这对你有用:

// you may have to move "interrupt" keyword to the left of the "void" declaration.  Or just remove it.
typedef void (interrupt *FN_INTERRUPT_HANDLER)(void);

interrupt void EPWMManager::Epwm1InterruptHandler(void)
{
 //some code to be called on interruption
}  

int main(void)
{
    FN_INTERRUPT_HANDLER p;
    p = EPWMManager::Epwm1InterruptHandler; // no ampersand

    // and if for whatever reason you wanted to invoke your function, you could just do this:

   p(); // this will invoke your function.

    return 0;
}

【讨论】:

  • 你是对的。提供的代码工作得很好。仔细查看我的代码后,我发现 typedef 被声明为外部 C,使其与 C++ 代码不兼容。我删除了它,它现在可以工作了。谢谢。
【解决方案2】:

你是不是错过了一个 ;在 typedef 中断 void (*PINT)(void) 之后? 你的代码为我编译。

【讨论】:

    【解决方案3】:

    我认为您在这里有几个不相关的语法错误:据我了解,您的 Epwm1InterruptHandler 应该返回一个指向中断类型函数的指针,然后首先从行中删除 void

    static interrupt void Epwm1InterruptHandler(void);
    

    static interrupt void Epwm1InterruptHandler(void);
    

    然后将 p 设为中断类型,然后像这样放置括号:

    interrupt p;
    p = &(EPWMManager::Epwm1InterruptHandler());
    

    【讨论】:

    • 那个函数IS是中断处理程序,而不是返回指向中断处理程序的指针。
    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 2022-11-21
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多