palavra-chave _Noreturn e macro noreturn (C11)

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)