如何使用函数指针noreturn?

时间:2015-02-26 09:49:01

标签: c c11 noreturn

我正在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();
}

函数Firmware_boot()永远不会返回,因此将其声明为noreturn是有意义的:

#include <stdnoreturn.h>

noreturn void
Firmware_boot( void );

但我需要将FirmwareBootFn声明为noreturn,以避免编译器抱怨Firmware_boot()可能会返回。

我尝试(可能)noreturntypedef的每个排列都没有任何结果。另外我明白该属性不能在typedef中设置,因为它不属于该类型。

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

1 个答案:

答案 0 :(得分:9)

C11中的

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

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

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

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