LoginSignup
2
0

More than 3 years have passed since last update.

C言語 control reaches end of non-void functionの対応方法

Posted at

警告メッセージの出るプログラム

#include <stdio.h>
#include <stdlib.h>

void msg_and_exit(const char *msg)
{
    printf("error :%s\n", msg);
    exit(1); // ここで強制終了する。
}
int fun(int i)
{
    if (i)
    {
        return 0;
    }
    msg_and_exit("message");
} // この行に関して警告メッセージが出る。
int main()
{
    fun(1);
}

このプログラムを-Wallのオプションを付けてコンパイルすると

> gcc -Wall -Wextra a.c
a.c: In function 'fun':
a.c:17:1: warning: control reaches end of non-void function [-Wreturn-type]

制御(control)がvoidでない(non-void)関数(function)の最終行(end)に到達する(reach)という警告(warning)メッセージが出る。

C言語でreturn文のない最終行はvoid型の値を返す。

msg_and_exit("message");の後にint型の値を返すreturn文を追記して警告メッセージを出さないようにできるが、到達しない文を追記したくない。exit関数で強制終了するので最終行に到達しない。

コメントを記述してコードチェックを無効にできるESlintのような方法を探してみたら、警告メッセージを出さない方法を発見した。

関数に_Noreturn指定子を記述することである。

_Noreturn void msg_and_exit(const char *msg)
{
    printf("error :%s\n", msg);
    exit(1);
}

_Noreturn関数指定子は2011年にC標準のC11に導入されたもので、その関数が呼び出し元に戻らないことをコンパイラに伝えるものである。

参考

まとめ

C言語のプログラムのコンパイル時にcontrol reaches end of non-void functionの警告メッセージが出た。

non-void型の値を返すreturn文を追記するのでなく、C11で導入された_Noreturn関数指定子を追記する方法で警告メッセージを出さないようにできた。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0