如何使用函数指针noreturn?

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

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  noreturn void Firmware_boot( void ); 

但是我需要将FirmwareBootFn声明为noreturn ,以避免编译器抱怨Firmware_boot()可能会返回。

我尝试(可能) typedef中的noreturn每个排列没有任何结果。 另外我明白属性不能在typedef设置,因为它不是类型的一部分。

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

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

由于你似乎有gcc,你可以使用扩展名

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

将函数指针标记为不返回。 不幸的是,似乎没有办法确保你分配给它的函数真的具有语法的所有属性。