Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Słowo _Noreturn kluczowe zostało wprowadzone w języku C11. Informuje kompilator, że funkcja, do którego jest zastosowana, nie powraca do elementu wywołującego. Kompilator wie, że kod po wywołaniu funkcji jest niemożliwy do _Noreturn osiągnięcia. Przykład funkcji, która nie zwraca, jest przerywana. Jeśli istnieje możliwość powrotu przepływu sterowania do elementu wywołującego, funkcja nie może mieć atrybutu _Noreturn .
Słowo kluczowe jest zwykle używane za pośrednictwem makra wygody , noreturnpodanego w <pliku stdnoreturn.h>, które mapuje na _Noreturn słowo kluczowe.
Podstawowe korzyści wynikające z używania _Noreturn (lub równoważnego noreturn) sprawiają, że intencja funkcji jest jasna w kodzie dla przyszłych czytelników i wykrywa nieumyślnie niedostępny kod.
Oznaczona noreturn funkcja nie powinna zawierać typu zwracanego, ponieważ nie zwraca wartości do elementu wywołującego. Powinna ona mieć wartość void.
Przykład użycia noreturn makra i _Noreturn słowa kluczowego
W poniższym przykładzie pokazano _Noreturn słowo kluczowe i równoważne noreturn makro.
Funkcja IntelliSense może wygenerować fałszywy błąd , E0065jeśli używasz makra noreturn , które można zignorować. Nie uniemożliwia to uruchomienia przykładu.
// 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;
}
Wymagania
| Makro | Wymagany nagłówek |
|---|---|
noreturn |
<stdnoreturn.h> |
Zobacz też
/std (Określ wersję standardową języka)
/W4 (Określ poziom ostrzeżenia)
Ostrzeżenie C4702
__declspec(noreturn)