我在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();
}
Run Code Online (Sandbox Code Playgroud)
函数Firmware_boot()永远不会返回,因此将其声明为noreturn:
#include <stdnoreturn.h>
noreturn void
Firmware_boot( void );
Run Code Online (Sandbox Code Playgroud)
但我需要声明FirmwareBootFn,noreturn以避免编译器抱怨Firmware_boot()可能返回.
我尝试(可能)noreturn在typedef没有任何结果的情况下的每个排列.另外我明白属性不能在中设置,typedef因为它不是类型的一部分.
有没有办法把我标记Firmware_boot()为noreturn避免警告(没有作弊警告抑制:-))?
_Noreturn在C11中只能应用于函数定义或声明.不幸的是,函数不返回的事实不是原型的一部分.
由于你似乎有gcc,你可以使用扩展名
typedef struct
{
uint32_t stackPointer;
__attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;
Run Code Online (Sandbox Code Playgroud)
将函数指针标记为不返回.不幸的是,似乎没有办法确保你分配给它的函数真的具有语法,allone所有的属性.