• ベストアンサー

関数原型宣言について

関数原型宣言について 下記のプログラムのfunc関数は、関数原型宣言 <func(int a, long b, char *c);>が述されていないのにfunc関数の仮引数の型longは、関数原型宣言が与えられるといると本に書かれていたのですが、何故でしょうか教えて頂きたい。 ******************************************** #include <stdio.h> /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } *************************************************************

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

まず、関数定義と関数原型はまったく別の概念です。 今回の場合、 > void func(int a, long b, char *c) の部分が関数原型になります。 関数定義は、関数本体を伴う関数宣言のことです。 仮に、 void func()  int a;  long b;  char *c; { } のように書いた場合、これは関数定義ですが、関数原型を含んでいません。 なお、少なくともC90の場合には、関数を呼び出す際に関数原型は必須ではありません。 func(a + 3, 2L, s); のように書けば、先ほどの関数原型を伴わない関数定義の関数でも問題なく呼び出すことができます。

dreamsturb
質問者

お礼

回答ありがとうございます。例題で関数定義と関数原型の違いがわかりました。 また、関数宣言と関数原型の違いもわかりました。

その他の回答 (4)

回答No.4

・関数プロトタイプ宣言(関数原型宣言)とは 「関数を定義する前に、その関数を呼び出す必要がある場合は、呼び出す前に関数プロトタイプ宣言が必要」 逆に言えば「関数を呼び出す前に、その関数を定義済み(関数の実体を書いた)の場合は、関数プロトタイプ宣言が不要」と言う事。

回答No.3

>関数原型宣言 <func(int a, long b, char *c);>が述されていない  じゃなくて、宣言と定義が同時に行われている。

noname#77845
noname#77845
回答No.2

質問の例題と #include <stdio.h> int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } を比べると判りませんか? コンパイルするとき、最初にmain関数からfunc関数を呼び出していますが、このときの引数「2」をコンパイラはどう考えるのでしょうね? #include <stdio.h> void func(int a, long b, char *c); int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } なら、コンパイラは引数の「2」はlong型だと思うんですけど。 じゃ、質問の例題はどうだろう…、というお話かな?

dreamsturb
質問者

お礼

回答ありがとうございます、私の例題のコンパイラは、関数の定義なので 引数の「2」は、long型と解釈しますが関数原型宣言では、ないのでしょうか

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

func関数を実行する前に、func関数の実体を定義するか、または関数プロトタイプ宣言があればよいです。 今回のコードは前者の例です。

関連するQ&A