2017-02-11 11 views
1

でより頻繁に使用されていないのはなぜそれは一例ではC.のconstポインタはC

でのconstポインタを使用してコードスニペットと実際のコードを参照するのは難しい:

FILE *fopen(const char *filename, const char *mode); 

私の質問です。なぜ私はそれを使用するのが理にかなっていてもconstポインタを使用しないのが普通だと私は確信しています。 私の例では、fopenは両方のパラメータでconstポインタを持つことができます。

私はconstの使い方を知っており、どのように動作するのか知っています。私の質問は、ソフトウェアエンジニアリングの観点と、大きなライブラリを書く人がそれをあまり使わない理由です。プロのコードでconstポインタを使用しない理由はありますか?通常、私は書籍とコードスニペットでconstについて多くを見るだけです。

+3

可能な限りconstを使用します。しかし、スタックオーバーフローでCライブラリ全体をここで書き直すことはできないと思います。 –

+0

[関数パラメータに 'const'を使用する]の複製があります(http://stackoverflow.com/questions/117293/use-of-const-for-function-parameters) – Downvoter

+0

私の質問は次のとおりです。実際のコードとプロフェショナルコードでconstポインタを使用しない理由はありますか? – Rodolfo

答えて

4

Cの初期バージョン(1989年の最初のANSI規格以前)は、constをまったくサポートしていませんでした。したがって、fopen()のような標準ライブラリの関数は、もともとはconst修飾子なしで指定されていました。

いくつかの専門的な設定では、古いコードと古いコンパイラを使用することは、下位互換性のために必要な場合があります(ただし、時間が進むにつれて希少になります。時間)。これには、これらの設定で使用されるライブラリの下位互換性が必要です。

このような特定の制約がない限り、constを適切に使用して最新のコードを書くことが望ましいです(たとえば、関数がポインタによって渡された引数を変更しないことを示す)。これにより、プログラマーのエラーを検出する機会が増えます(例えば、呼び出し元が変更しない引き数を変更する関数)。

constを使用しないコードの一般的な理由は、プログラマ(または悪い顧客)です。クイックデリバリの詳細 - エラーなしでいくつかのテストケースをコンパイルして渡すコードの取得は優先順位1ですが、可能性のあるあらゆる不測の事態に適切に対応しているコードは、それほど重要ではない(または他の誰かの問題)と考えられています。そのような設定では、constは、(例えば、何かをタグ付けした関数constを変更する機能のために)より多くのコンパイルエラーを引き起こし、したがって、コードをコンパイルするためにより多くの労力と時間を必要とする。 constを省略すると、コードのコンパイルが容易になります。現代のテキストエディタやIDEでは、サードパーティライブラリを使用していない限り、コードベースでconstのインスタンスをすべて削除すると、コンパイルエラーの数が表面的に減少する可能性があります。逆に、constが便利なコード内のすべての場所を特定することは難しく、コードベースでconstの使用量を増やした場合の即時の報酬は、コンパイルされないコードを修正するために多くの作業を行う必要があります。

つまり、constの利点は即時ではありませんので、短期的な "配信または死亡"のメンタリティを持つ開発者/管理者/顧客には関係なく、後に問題を解決する必要はありません。

+1

ハードで時代遅れの古いコンパイラのためのクイックフィックス: '#define const'。 'const'修飾されたポインターを使用しないことはまともな理由はありません。 'const int i = 3'や' const char * const filename'のような 'const'ローカル変数と引数を宣言することは、あまり役に立たず、不必要な混乱を招きます。 – chqrlie

+0

あなたは間違った方向に考えています。コードが 'const'をサポートしないコンパイラが1つしかないハードウェアプラットフォームをターゲットにしている場合、' #define const'のようなものは何の利益も与えません。ほとんどのそのような例は規制されたアプリケーションドメイン内にあるため、そのようなマクロがシステム内のコードの動作を変更しないという正当性を文書化する必要があります。実際にコンパイラに意味を持たないときに厳格な規制当局の人々が 'const'を使用するよう強制すると、そのソフトウェアの規制上の負担が大きくなります。 – Peter

+0

'#define const'は、コンパイラが' const'キーワードをサポートしていない場合にのみ定義されます。コードが 'const'を識別子として使用せず、' const a = 1; 'のように型情報を取り除かない限り、' const'の効果をプリプロセッサで取り除くことはOKです。コマンドラインの定義 '-Dconst ='は、ソースファイルにパッチを当てなくても同じ効果があります。 'const'をサポートしていないCコンパイラは、実装している言語がC言語の遠いいとこであることを陳腐化しています。私はそのような制約の厳しい環境で作業したくないです... – chqrlie

関連する問題