Я пишу загрузчик в 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()
может вернуться.
Я попробовал (возможно) каждую перестановку noreturn
в typedef
без какого-либо результата. Также я понял, что атрибут не может быть установлен в typedef
, потому что он не является частью этого типа.
Есть ли способ пометить мой Firmware_boot()
как noreturn
, избегая предупреждения (ну без обмана с предупреждением: -))?