Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
palavra-chave
A palavra-chave _Noreturn foi introduzida em C11. Ela informa ao compilador que a função à qual ela é aplicada não retornará ao chamador. Como consequência, o compilador sabe que o código seguinte a uma chamada para uma função _Noreturn estará inacessível. Um exemplo de uma função que não retorna é anular. Se houver uma possibilidade de o fluxo de controle retornar ao chamador, a função não deve ter o atributo _Noreturn.
A palavra-chave normalmente é usada por meio da macro de conveniência, noreturn, fornecida em <stdnoreturn.h>, que mapeia para a palavra-chave _Noreturn.
Os principais benefícios de usar _Noreturn (ou o equivalente noreturn) são deixar clara a intenção da função no código para leitores futuros e detectar código inacessível de forma involuntária.
Uma função marcada noreturn não deve incluir um tipo de retorno, porque ela não retorna nenhum valor para o chamador. Ela deverá ser void.
Exemplo usando macro noreturn e palavra-chave _Noreturn
O exemplo a seguir demonstra a palavra-chave _Noreturn e a macro equivalente noreturn.
O IntelliSense pode gerar um erro falso, E0065, se você usar a macro noreturn, que pode ser ignorada. Isso não impede que você execute o exemplo.
// 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;
}
Requisitos
| Macro | Cabeçalho necessário |
|---|---|
noreturn |
<stdnoreturn.h> |
Confira também
/std (Especificar versão padrão da linguagem)
/W4 (Especificar nível de aviso)
aviso C4702
__declspec(noreturn)