作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

戻らない関数(_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しましたが、違いはありませんでした。コード最適化よりも、可読性のために付けるものかもしれません。

更新情報