如何使用noreturn与函数指针?

如何使用noreturn与函数指针?,第1张

概述我正在C11写一个引导程序.当引导程序需要将控件传输到固件时,它会读取一个预定义的存储器地址的函数指针并调用它.代码如下所示: typedef void (FirmwareBootFn)(void);typedef struct{ uint32_t stackPointer; FirmwareBootFn* programCounter;}FirmwareBootCont 我正在C11写一个引导程序.当引导程序需要将控件传输到固件时,它会读取一个预定义的存储器地址的函数指针并调用它.代码如下所示:
typedef voID (FirmwareBootFn)(voID);typedef struct{    uint32_t stackPointer;    FirmwareBootFn* programCounter;}FirmwareBootControl;static FirmwareBootControl g_bootControl __attribute__ ((section (".boot_control")));voIDFirmware_boot( voID ){    setStackPointer( g_bootControl.stackPointer );    g_bootControl.programCounter();}

功能Firmware_boot()从不返回,所以把它定义为noreturn是有意义的:

#include <stdnoreturn.h>noreturn voIDFirmware_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;

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

总结

以上是内存溢出为你收集整理的如何使用noreturn与函数指针?全部内容,希望文章能够帮你解决如何使用noreturn与函数指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存