如何使用函数指针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;
将函数指针标记为不返回。 不幸的是,似乎没有办法确保你分配给它的函数真的具有语法的所有属性。