如何将 noreturn 与函数指针一起使用?

2024-04-07

我正在用 C11 编写引导加载程序。当引导加载程序需要将控制权转移给固件时,它会读取预定义内存地址处的函数指针并调用它。代码如下所示:

typedef void (FirmwareBootFn)(void);

typedef struct
{
    uint32_t stackPointer;
    FirmwareBootFn* programCounter;
}
FirmwareBootControl;

static FirmwareBootControl g_bootControl __attribute__ ((section (".boot_control")));

void
Firmware_boot( void )
{
    setStackPointer( g_bootControl.stackPointer );
    g_bootControl.programCounter();
}

功能Firmware_boot()永远不会返回,因此将其声明为是有意义的noreturn:

#include <stdnoreturn.h>

noreturn void
Firmware_boot( void );

但我需要声明FirmwareBootFn as noreturn以及避免编译器抱怨Firmware_boot()可能会回来。

我(可能)尝试了每一种排列noreturn in the typedef没有任何结果。我还了解到该属性无法在typedef因为它不是类型的一部分。

有没有办法标记我的Firmware_boot() as noreturn避免警告(并且不会通过警告抑制作弊:-))?


_NoreturnC11 中只能应用于函数定义或声明。不幸的是,函数不返回的事实并不是原型的一部分。

既然你似乎有 gcc 你可以使用扩展

typedef struct
{
    uint32_t stackPointer;
    __attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;

将函数指针标记为不返回。但不幸的是,似乎没有办法确保您分配给该函数的语法确实具有该属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 noreturn 与函数指针一起使用? 的相关文章

随机推荐