2009-06-03 8 views
2

私は、特定のクラスの関数の関数プロトタイプを含まないCコードを扱っています。関数プロトタイプを使用しないことに利点はありますか?関数は互いに呼び出すことはなく、パラメータもありません。コードが大きく変わるので、編集する行が1つ少なくなるかもしれません。Cで関数プロトタイプを使用しないと何か利点はありますか?

答えて

5

関数プロトタイプは外部関数用です。私の規則は、すべての非静的関数はmain()以外のプロトタイプを取得するということです。私は '-Wmissing-prototypes' GCCオプションを使用します。通常、関数が静的であることを宣言するのを忘れると、それがキャッチします。また

、Cでこのような機能を宣言:第二の方法は、関数は「にISNパラメータの不特定多数を取ることを意味するので

void function(); 

void function(void); 

としないこのようにあなたが望むもの(ANSI C以前との互換性のためです)。

+2

私はまた、.cファイルの先頭に静的ファンクションのプロトタイプを使用します。あなたが実装されている順序について心配する必要はありません。 – gnud

+0

私は静的関数のプロトタイプを使用していましたが、その後ほとんどの時間には納得できませんでした。プロトタイプがあれば、2つの場所で情報を繰り返すことになります。インターフェイスの場合、それは必要ですが、なぜ静的関数でそれを行うのですか? –

+0

@Chris:いくつかのコンパイラは、プロトタイプがスコープにない場合、パラメータに関する安全でない仮定をするでしょう。 –

0

私が見る唯一の利点は、関数プロトタイプを更新するたびに関数自体を変更する必要がないことです。

+1

これは唯一の怠惰です。 – akappa

1

"だから、編集する行が1つ少なくなっているのでしょうか?"

これは、この場合の唯一の可能な「メリット」です。単純な怠惰です。

1

変更するコードが少ないことは、私が考えることができる唯一の「利点」です。通常、これはちょうど「怠惰な」ものです

いずれにしても、欠点はより重要です。すべての機能を1つのソースファイルにまとめる必要があります。ソースファイルの関数の順序が重要になります。また、他の人はヘッダーファイルを見たり/探したりして混乱します。ベストプラクティスは.cと.hです。

4

いいえ

厳密には正当なものであるかどうかわかりません。

+2

プロトタイプを使用しないことは合法です。宣言されていない関数を使用することは正当ではありません。すべてのプロトタイプは宣言ですが、いくつかの宣言はプロトタイプではありません。バリデーショナル関数の場合にのみプロトタイプは絶対的に必須です。 –

0

コードが大きく変更されるため、 編集する行が1つ少なくなります。

私はそれが理由だと思います。それ以外の理由は考えられません。コンパイル速度の変更(実際上)も実行時間も、コードを更新するための時間だけではありません。

2

関数プロトタイプに適用すると "コードが大きく変更されます"もコードの匂いが悪いです。インタフェース(関数の署名)が大きく変わると、関数の責任はあまり明確ではありません。最初に、問題をサブレスポンスに分割する方法を理解し、その後にコードを書くことを開始します。

0

私が考えることができる唯一の利点は、関数の最初の行を.cまたは.hファイルのプロトタイプセクションにコピーアンドペーストする必要がなくなることです。

他のファイルで参照される関数については、プロトタイプを持つ以外に選択肢はありません。

ファイルスコープを持つ関数(静的関数)の場合、ブロック内のすべてのプロトタイプをファイルの先頭に置くと便利です。そうすれば、静的関数はそのファイル内のどこからでも呼び出すことができます。プロトタイプなしでは、関数A()はB()がコード内で宣言されている場合にのみ関数B()を呼び出すことができます。

また、一部のコンパイラは、プロトタイプがスコープ内にない場合、パラメータに関する安全でない仮定を行います。

さらに、MISRA-Cに準拠したコードを書く場合、すべて関数のプロトタイプがスコープに含まれている必要があります。

プロトタイプだけを見てパラメータの目的を明確にしているので、プロトタイプにパラメータ名が含まれていることを保証することも薦めたいと思います。

0

これはタイピングが少ないので、RSIのリスクを軽減する可能性があります。

関連する問題