2011-03-08 5 views
0

C言語ではプロトタイプや定義なしの関数を呼び出すことができ、コンパイル(リンクなし)はうまくいきました。 linkコマンドに渡される他のモジュールで関数が定義されていると、リンクが機能します。しかし、コールサイトは、それに渡されるすべてのパラメータがintタイプであると仮定します。この動作やC標準の一部についてのドキュメントはありますか?スコープで宣言を持っていないCでプロトタイプなしで関数を呼び出すためのドキュメントはありますか?

たとえば、ソースファイルの下にVCで問題なくコンパイルすることができ++ 2010

// NoPrototype.c 
// Compile it as cl.exe /c NoPrototype.c 
int main() 
{ 
    FakeFunction(1, 2, 3); // No definition for this function in this compilation unit. 
} 
+4

[Cの関数プロトタイプを宣言する必要がありますか?](http://stackoverflow.com/questions/2575153/must-declare-function-prototype-in​​-c) [プロトタイプのない旧式の関数を使ったCコンパイラの動作](http://stackoverflow.com/questions/2287164/the-behavior-of-ac-compiler-with-old-styled-functions-without-プロトタイプ)。 –

答えて

1

はUBです。

J.2未定義挙動

- 関数は関数プロトタイプで定義される範囲内の関数プロトタイプなしの関数への呼び出しのために、いずれかのプロトタイプは、省略記号又は引数の型で終了しますプロモーション後は、パラメータの種類(6.5.2.2)と互換性がありません。

はコモには、それはそれだった(と、事前C99である)int型のパラメータをint型を返すと取っ機能を持ってしても大丈夫、古い、あらかじめ標準C.で働いていた方法があるあなたのコード

"ComeauTest.c", line 5: error: identifier "FakeFunction" is undefined 
    FakeFunction(1, 2, 3); // No definition for this function in this compilation unit. 
    ^

1 error detected in the compilation of "ComeauTest.c" 
+3

あなたの見積もりに記載されているケースでは、定義されていない動作のみです。 'FakeFunction'の実装が3つのint引数を取る場合、OPの場合は未定義ではありません。 –

+0

はい、しかし、 'FackFunction'は他のコンパイル単位で正しいパラメータ(3 int)で定義されていますか? – Thomson

1

拒否しますプロトタイプなしで。各呼び出しで実際に使用しているパラメータの数を含め、関数が他の.cファイルでどのように見えるかを確認するのは、あなたの責任です。

これは、toupperのような機能がint toupper(int c);であり、charを使用していない理由です。もともとはプロトタイプなしで使用されていましたが、暗黙的なインターフェイスが詰まっていました!

関連する問題