質問: 自分は最近プログラムを習い始めたのですが、 ``` #include #include void humanA(); int main(){ humanA(); HgGetChar(); HgClose(); return 0; } void humanA(){ HgCircle(300,75,25); HgLine(300, 50, 300, 25); HgLine(275, 38, 325, 38); HgLine(275, 38, 275, 25); HgLine(325, 38, 325, 50); HgLine(300, 25, 275, 0); HgLine(300, 25, 325, 25); HgLine(325, 25, 325, 0); } ``` このような感じで棒人間をプロトタイプ宣言をして表示させたいのですが warningが出ます。何がいけないのか教えて欲しいです。
回答: `void humanA();` は [c](/questions/tagged/c "'c' のタグが付いた質問を表示") の場合「プロトタイプ宣言でない関数宣言」と解釈されます。歴史的な都合により、関数の引数が `()` つまり括弧の中が空であるとき、すなわち `(void)` でない場合、 - 任意の型、任意の個数の引数を受け入れる ような旧式の関数宣言であってプロトタイプ宣言ではないとみなされます。 (これが昔々の [c](/questions/tagged/c "'c' のタグが付いた質問を表示") の仕様なのでそれに合わせている) [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") では `void humanA();` は `void humanA(void);` と書いたことと同じで「引数がない関数」というプロトタイプ宣言になるのですが、関数宣言の引数が空の場合に限り [c](/questions/tagged/c "'c' のタグが付いた質問を表示") と [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") で挙動が違います。 `gcc` の場合 `-Wstrict-prototypes` を指定すると提示のソースコードに対して `warning: function declaration isn't a prototype` なる警告が3つ表示されます。