Я пишу загрузчик в 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, избегая предупреждения (ну без обмана с предупреждением: -))?