如何将 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.
我(可能)尝试了 typedef
中 noreturn
的所有排列,但没有任何结果。我还了解到无法在 typedef
中设置属性,因为它不是类型的一部分。
有没有办法将我的 Firmware_boot()
标记为 noreturn
避免警告(好吧,没有警告抑制作弊 :-))?
C11中的_Noreturn
只能应用于函数定义或声明。不幸的是,函数不 return 不是原型的一部分。
因为你似乎有 gcc 你可以使用扩展
typedef struct
{
uint32_t stackPointer;
__attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;
将函数指针标记为未 returning。不幸的是,似乎没有办法确保您分配给它的函数确实具有语法 属性,allone.
我正在用 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.
我(可能)尝试了 typedef
中 noreturn
的所有排列,但没有任何结果。我还了解到无法在 typedef
中设置属性,因为它不是类型的一部分。
有没有办法将我的 Firmware_boot()
标记为 noreturn
避免警告(好吧,没有警告抑制作弊 :-))?
_Noreturn
只能应用于函数定义或声明。不幸的是,函数不 return 不是原型的一部分。
因为你似乎有 gcc 你可以使用扩展
typedef struct
{
uint32_t stackPointer;
__attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;
将函数指针标记为未 returning。不幸的是,似乎没有办法确保您分配给它的函数确实具有语法 属性,allone.