====== stdnoreturn.h ====== Der Header ''stdnoreturn.h'' enthält das Funktions-Attribut ''noreturn''. Unter C++ ist die Datei als ''cstdnoreturn'' einzubinden. \\ \\ ''stdnoreturn'' ist ab C11 Teil des Standards. Für ältere Compiler (z.B. GCC vor Version 4.7) muss die C11-Unterstützung explizit aktiviert werden: $ gcc -o main main.c -std=c11 ===== Funktions-Attribut noreturn ===== Mittels ''noreturn'' werden Funktionen markiert, die nie wieder zur aufrufenden Funktion zurückkehren. Dabei wird die Markierung einfach vor den Funktionsnamen geschrieben: void noreturn deadEnd(); Eine nicht zurückkehrende Methode kann durch [[c:lib:stdlib:exit|exit()]] oder [[c:lib:setjmp:longjmp|longjmp()]] erzeugt werden. Folgendes Beispiel demonstriert die Verwendung von ''noreturn'': #include #include #include void noreturn deadEnd(); int main() { deadEnd(); printf( "infinity reached!!!\n" ); return 0; } void noreturn deadEnd() { exit( 1 ); } Der Compiler zeigt in diesem Fall keine Warnung an.\\ Ist eine Methode als ''noreturn'' markiert, obwohl eine (wenn auch nur theoretische) Möglichkeit der Rückkehr besteht, weist der Compiler darauf hin: #include #include void noreturn deadEnd(); int main() { deadEnd(); printf( "infinity reached!!!\n" ); return 0; } void noreturn deadEnd() { printf( "not today ;)\n" ); } Der obige Code liefert folgende Compiler-Ausgabe: noreturn.c:18:1: warning: ‘noreturn’ function does return [enabled by default] In diesem Beispiel kehrt die Funktion auf jeden Fall zurück. Der Compiler zeigt auch eventuell ungewollte ''return''-Statements an oder warnt uns vor der Möglichkeit des Rückkehrens: #include #include #include void noreturn deadEnd(); int main() { deadEnd( 3 ); printf( "infinity reached!!!\n" ); return 0; } void noreturn deadEnd( int value ) { if( value == 0 ) return; else if( value == 1 ) exit( 1 ); printf( "not today ;)\n" ); } Dieser Code liefert gleich 2 Warnungen: noreturn.c:18:5: warning: function declared ‘noreturn’ has a ‘return’ statement [enabled by default] noreturn.c:18:5: warning: ‘noreturn’ function does return [enabled by default] Die erste wird durch das ''return'' verursacht, die zweite durch die Möglichkeit des Rückkehrens zur aufrufenden Funktion. \\ ---- [[http://www.proggen.org/forum/viewtopic.php?f=39&t=5139|Diskussionsthread]]