加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用noreturn与函数指针?

发布时间:2020-12-16 05:44:12 所属栏目:百科 来源:网络整理
导读:我正在C11写一个引导程序.当引导程序需要将控件传输到固件时,它会读取一个预定义的存储器地址的函数指针并调用它.代码如下所示: typedef void (FirmwareBootFn)(void);typedef struct{ uint32_t stackPointer; FirmwareBootFn* programCounter;}FirmwareBoo
我正在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()可能返回.

我尝试(可能)在typedef的每个排列的noreturn没有任何结果.我也明白,该属性不能在typedef中设置,因为它不是类型的一部分.

有没有办法标记我的Firmware_boot()作为noreturn避免警告(没有作弊与警告抑制:-))?

解决方法

_Nnurnurn C11只能应用于函数定义或声明.不幸的是,函数不返回的事实不是原型的一部分.

由于你似乎有gcc可以使用扩展名

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

将函数指针标记为不返回.不幸的是,似乎没有办法确保你分配的功能真的具有语法,所有的属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读