Поделиться через


Ключевое слово _Noreturn и макрос noreturn (C11)

Ключевое слово _Noreturn было представлено в стандарте C11. Оно указывает компилятору, что функция, к которой оно применяется, не возвращается в вызывающий объект. Таким образом, компилятор знает, что код после вызова функции _Noreturn недостижим. Примером функции, которая не выполняет возврат, является abort. Если поток управления может вернуться в вызывающий объект, функция не должна иметь атрибут _Noreturn.

Это ключевое слово обычно используется в удобном макросе noreturn, который находится в файле <stdnoreturn.h> и сопоставляется с ключевым словом _Noreturn.

Ключевое слово _Noreturn (или эквивалентный ему макрос noreturn) позволяет четко описать предназначение функции пользователям, которые в дальнейшем будут работать с кодом, а также определить код, который по каким-либо причинам является недоступным.

Функция, помеченная noreturn, не должна включать тип возвращаемого значения, так как она не возвращает значение вызывающему объекту. Оно должно иметь значение void.

Пример использования макроса noreturn и ключевого слова _Noreturn

В следующем примере иллюстрируется использование ключевого слова _Noreturn и эквивалентного ему макроса noreturn.

Если используется макрос noreturn, который можно игнорировать, функция IntelliSense может возвращать ложную ошибку E0065. Ее появление не мешает запустить пример.

// Compile with Warning Level4 (/W4) and /std:c11
#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>

noreturn void fatal_error(void)
{
    exit(3);
}

_Noreturn void not_coming_back(void)
{
    puts("There's no coming back");
    fatal_error();
    return; // warning C4645 - function declared with noreturn has a return statement
}

void done(void)
{
    puts("We'll never get here");
}

int main(void)
{
    not_coming_back();
    done(); // warning c4702 - unreachable code

    return 0;
}

Требования

Макрос Обязательный заголовок
noreturn <stdnoreturn.h>

См. также

/std (определение стандартной версии языка)
/W4 (выбор уровня предупреждения)
Предупреждение C4702
__declspec(noreturn)