戻らない関数(_Noreturn)
C11で、関数指定子_Noreturn
が追加されました。_Noreturn
指定子は、呼び出し元に戻る必要がない関数、つまり、そのままプログラムが終了するような関数に付けられます。_Noreturn
指定子の目的は、コンパイルを最適化するためです。呼び出し元に戻るつもりがないのであれば、呼び出し元のアドレスをレジスタに積む必要がなくなります。
標準ライブラリの関数だと、exit()
やabort()
が該当します。例外的な関数として、事前にマクロで定義した地点に飛ぶlongjmp()
があります。
『Cクイックリファレンス』118頁
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
_Noreturn static void faitalError(void);
int main(void)
{
printf("Enter within 5 characters: ");
const int Max = 8;
char buf[Max];
fgets(buf, Max, stdin);
const int Limit = 6; // 5 characters + '\0'
if (strlen(buf) > Limit) {
faitalError();
}
printf("%s", buf);
return 0;
}
_Noreturn static void faitalError(void)
{
puts("Exceeds 5 characters");
exit(EXIT_FAILURE);
}
_Noreturn
指定子を付けたコードと、付けてないコードのアセンブラのファイルをdiff
しましたが、違いはありませんでした。コード最適化よりも、可読性のために付けるものかもしれません。