中断中C函数调用C++

简介:
  之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需要解决了问题:在断函数中怎么调用C++的成员函数?

    我的中断函数定义在文件 IRQHander.c 文件中,我想在串口中断函数调用 gPrinter.Putchar(ch) 函数。用于向 gPrinter 发送字符打印消息。

   尝试1:直接将 CDebug.h 文件包含进来。


<strong>#include "CDebug.h" 
       
void USART1_IRQHandler()  
{  
    RxData = USART1->DR;  
    gDebug.Printer(RxData);  
    ...  
}</strong>

   结果,一大堆错误。原因在于编译器以C的方试进行编译,然而C不认得 CDebug.h 文件中 class 这样的C++中的关键字。


    尝试2:将 IRQHandle.c 文件重命名为 IRQHandle.cpp ,让其以C++的方式进行编译。

    结果,编译没有问题。一旦触发了中断,系统就死在 startup.s 文件中默认的中断函数中了。这个默认的中断函数为找不到用户定议的中断处理函数默认指定的。原因在于 IRQHandle.cpp 中 USART1_IRQHandler() 在用C++进行编译后会根据参数类型对函数名进行修饰,因为C++要实现重载功能。如:

    原定义函数:int  Func ( int , char * )

    C++编译后:int  Func_i_cp ( int, char* ) 

    尝试3:加 extern "C" {} 进行修饰,让编译器不修改函数名。


<strong>#include "CDebug.h" 
       
extern "C" {  
       
void USART1_IRQHandler()  
{  
    RxData = USART1->DR;  
    gDebug.Printer(RxData);  
    ...  
}  
void Other_IRQHandler()  
{  
  ...    
}  
    ....  
       
    } </strong>

    结果,OK了。分析如下:
    (1)IRQHandler.c文件重命名为IRQHandle.cpp,让编译器用C++的方式进行编译,从而include C++ 的头文件不会报错。

    (2)加 extern "C" 的功能就是告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。


    所以,要在C函数调用C++的成员函数,就像方案3那么做。


目录
相关文章
|
6月前
|
编译器 Linux C语言
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
160 0
|
6月前
|
存储 编译器 C++
C++程序中的函数调用:模块化编程的基石
C++程序中的函数调用:模块化编程的基石
55 1
|
6月前
|
存储 编解码 开发框架
【C++ 多态 】了解 C++ 中的类型擦除和虚拟函数调用
【C++ 多态 】了解 C++ 中的类型擦除和虚拟函数调用
139 1
|
6月前
|
存储 算法 安全
【C++ 泛型编程 高级篇】 C++编译时函数调用技术深度解析
【C++ 泛型编程 高级篇】 C++编译时函数调用技术深度解析
83 1
|
6月前
|
Linux C++
【代码片段】Linux C++打印当前函数调用堆栈
【代码片段】Linux C++打印当前函数调用堆栈
191 0
|
6月前
|
设计模式 存储 算法
【C++ 函数调用操作符】探究C++中的函数调用操作符 基础到高级应用
【C++ 函数调用操作符】探究C++中的函数调用操作符 基础到高级应用
338 0
|
6月前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】C++ 元模板推导函数调用的结果类型 std::result_of/std::invoke_result全面教程
【C++ 泛型编程 进阶篇】C++ 元模板推导函数调用的结果类型 std::result_of/std::invoke_result全面教程
337 0
|
6月前
|
缓存 Linux 编译器
C/C++ 函数调用以及Linux中系统调用 开销介绍:介绍C/C函数调用以及Linux中系统调用的开销情况
C/C++ 函数调用以及Linux中系统调用 开销介绍:介绍C/C函数调用以及Linux中系统调用的开销情况
98 0
|
6月前
|
存储 C++
面试题:C++函数调用的过程?
面试题:C++函数调用的过程?
79 0
|
6月前
|
存储 数据安全/隐私保护 C++
[C++从入门到精通] 1.函数调用、访问权限、类简介(Struct和Class区别)
[C++从入门到精通] 1.函数调用、访问权限、类简介(Struct和Class区别)
120 0