c++ - 在模板实例化上声明一个 extern C 函数

标签 c++

我正在研究 MCU (STM32F4)。 在当前系统中,所有中断处理程序都在链接文件中声明为弱符号,如果我们想使用一个,我们只需在 C 中声明一个具有相同名称的函数,并在链接时替换弱符号。

我正在尝试将我的系统转换为 C++,我设想了一个系统,其中实例化某种中断类型将在模块中声明相应的 C 函数。

考虑到成员函数禁止使用 extern "C",我不知道如何实现这一点。

有什么想法或替代方案吗? 我的目标是尝试静态检查一些东西并尝试在该领域使用一些现代 C++。

这是 C 中的当前情况。 我有一个包含这个东西的程序集文件:

g_pfnVectors:
.word  _estack
.word  Reset_Handler
(...)
.word  SysTick_Handler
(...)
/*******************************************************************************
*
* Provide weak aliases for each Exception handler to the Default_Handler. 
* As they are weak aliases, any function with the same name will override 
* this definition.
* 
*******************************************************************************/
(...)
.weak      SysTick_Handler
.thumb_set SysTick_Handler,Default_Handler   

在我的 C 代码中,我有:

main() {
    (...)
    SysTick_Config(SystemCoreClock / cncMemory.parameters.clockFrequency);

    while (1);
}
void SysTick_Handler(void) {
    cncMemory.tick++;
}

我设想的是这样的:

int main() {
    MCU<mySystickHandler, ...> mcu;
    mcu.start();
}

static void mySystickHandler(void) {
    cncMemory.tick++;
}

或接近的东西(可能没有仍然全局的功能,但我尝试将问题分开)。

最佳答案

我不知道这有什么标准。

如果您想留在该语言中,则必须查看扩展,因为编译器长期以来一直提供编译指示和属性来控制此类内容。对于 gcc,asm labels似乎是为这个问题设计的。我没有使用过它,而且我有一个先验,它不能与模板一起使用,除非是明确的专门化。

另一种方法显然是使用链接器级别的技巧。

  • 据我所知,如果弱符号是对象提供的唯一符号,则它不会生成提供从静态库中提取的对象文件。您可以安排从 C 提供给您的模板的目标文件还提供您想要的实例化所需的另一个唯一符号。

  • 链接器脚本功能强大,如果自从我上次处理嵌入式系统以来事情没有太大变化(那是很久以前的事了,它们必须改变,我只是不知道它们是否在这方面发生了变化)自定义链接描述文件在该领域仍然是强制性的。

关于c++ - 在模板实例化上声明一个 extern C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205948/

相关文章:

c++ - 反向迭代 2 个循环?

c++ - 了解 ATI 和 NVIDIA 在 OpenGL 渲染方面的差异的良好来源?

c++ - 将函数加好友时出错

c++ - 不同的 IDE 产生 0 个错误与 28 个错误

c++ - 在没有显式调用的情况下强制在子方法之前执行父方法

c++ - Visual Studio 代码语法高亮显示错误但编译

c++ - Arduino 代码是否可移植到定制 PCB?

c++ - 为三个名称提示中的每一个在 C++ 中生成随机字符

c++ - Visual Studio 报告的堆错误,但仅在 Debug模式下

c++ - Openssl,无效参数 ' Candidates are: int BN_set_word(bignum_st *, ?) '