我正在用 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
避免警告(并且不会通过警告抑制作弊:-))?
_Noreturn
C11 中只能应用于函数定义或声明。不幸的是,函数不返回的事实并不是原型的一部分。
既然你似乎有 gcc 你可以使用扩展
typedef struct
{
uint32_t stackPointer;
__attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;
将函数指针标记为不返回。但不幸的是,似乎没有办法确保您分配给该函数的语法确实具有该属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)