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

How to use noreturn with function pointer?

我正在用 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() 永远不会 return,因此将其声明为 noreturn:

是有意义的
#include <stdnoreturn.h>

noreturn void
Firmware_boot( void );

但我还需要将 FirmwareBootFn 声明为 noreturn 以避免编译器抱怨 Firmware_boot() 可能 return.

我(可能)尝试了 typedefnoreturn 的所有排列,但没有任何结果。我还了解到无法在 typedef 中设置属性,因为它不是类型的一部分。

有没有办法将我的 Firmware_boot() 标记为 noreturn 避免警告(好吧,没有警告抑制作弊 :-))?

C11中的

_Noreturn只能应用于函数定义或声明。不幸的是,函数不 return 不是原型的一部分。

因为你似乎有 gcc 你可以使用扩展

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

将函数指针标记为未 returning。不幸的是,似乎没有办法确保您分配给它的函数确实具有语法 属性,allone.