Ключевое слово _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)