第07問の答え

答え

この書き方だと引数が「不定」になってしまう!
void SayHello();
引数が「ない」ときは、こう書くのが正解!
void SayHello(void);

解説

今回のプログラムは、第06問と似ていますね。サブルーチンSayHello()を手前で宣言して、main()から呼び出せるようにしています。ただし、SayHello()には引数がありません。

こういう場合、引数リストを省略して()と書くと、C言語では引数が「不定」という扱いになってしまいます。引数が「ない」ときは、そのことを(void)と明示しなければなりません。

そのため、SayHello()の宣言は、正しくはこう書きます。

void SayHello(void);

定義するときも同様で、こうです。

void SayHello(void) {
  ……
}

さらに、main()も同様です。

int main(void) {
  ……
}
質問でーす!引数が「不定」の関数って、どういうときに使うんですか?
それがねぇ、使わないのよ。
ええっ!
引数が「不定」っていうのはね、古いバージョンのコンパイラの仕様なの。
昔の書き方ってことですか?
そうそう。古いプログラムが動かなくなってしまわないように、昔の書き方も許されているということね。

なおC++では、引数リストを()と省略すると、(void)と同じように引数「なし」の意味になります。C言語よりも新しいプログラミング言語なので、歴史的な「しがらみ」も少ないというわけです。

ここがポイント!
引数「なし」の関数は(void)と書こう!

修正後のプログラム

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

void SayHello(void);

int main(void) {
  SayHello();

  return EXIT_SUCCESS;
}

void SayHello(void) {
  puts("Hello!");
}
実行結果
Hello!