警告メッセージの出るプログラム
# 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に導入されたもので、その関数が呼び出し元に戻らないことをコンパイラに伝えるものである。
参考
- https://ja.cppreference.com/w/c/language/_Noreturn _Noreturn 関数指定子
まとめ
C言語のプログラムのコンパイル時にcontrol reaches end of non-void functionの警告メッセージが出た。
non-void型の値を返すreturn文を追記するのでなく、C11で導入された_Noreturn
関数指定子を追記する方法で警告メッセージを出さないようにできた。