gpt4 book ai didi

c - 如何将 noreturn 与函数指针一起使用?

转载 作者:太空狗 更新时间:2023-10-29 16:41:27 24 4
gpt4 key购买 nike

我正在用 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 声明为 noreturn,以避免编译器提示 Firmware_boot() 可能会返回。

我(可能)尝试了 typedefnoreturn 的所有排列,但没有任何结果。我还了解到该属性不能在 typedef 中设置,因为它不是类型的一部分。

有没有办法将我的 Firmware_boot() 标记为 noreturn 来避免警告(好吧,不用警告抑制作弊 :-))?

最佳答案

C11 中的

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

因为你似乎有 gcc 你可以使用扩展

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

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

关于c - 如何将 noreturn 与函数指针一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28739082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com