Compartir a través de


Palabra clave _Noreturn y macro noreturn (C11)

La palabra clave _Noreturn se presentó en C11. Indica al compilador que la función a la que se ha aplicado no devuelve un valor al autor de la llamada. El compilador sabe que no se puede tener acceso al código que sigue a una llamada a una función _Noreturn. Un ejemplo de una función que no devuelve ningún valor es abort. Si existe la posibilidad de que el flujo de control devuelva un valor al autor de la llamada, la función no debe tener el atributo _Noreturn.

La palabra clave se suele usar mediante la macro de conveniencia, noreturn, proporcionada en <stdnoreturn.h>, que se asigna a la palabra clave _Noreturn.

Las principales ventajas de usar _Noreturn (o el equivalente noreturn) son dejar clara la intención de la función en el código para lectores futuros y detectar código inaccesible de forma involuntaria.

Una función marcada como noreturn no debe incluir un tipo de valor devuelto porque no devuelve ningún valor al autor de la llamada. Debe ser void.

Ejemplo de uso de la macro noreturn y la palabra clave _Noreturn

En el siguiente ejemplo se muestra el uso de la palabra clave _Noreturn y la macro equivalente noreturn.

IntelliSense puede generar un error falso que puede pasar por alto, E0065, si se usa la macro noreturn. No evita que ejecute el ejemplo.

// 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 Encabezado necesario
noreturn <stdnoreturn.h>

Vea también

/std (Especificar la versión estándar del lenguaje)
/W4 (Especificar el nivel de advertencia)
Advertencia C4702
__declspec(noreturn)