11

何かが変更可能であることが意図されていない限り、使用するのは明らかに良い習慣constですが、どこまで行きますか? 文字列の配列がある場合、関数の署名にこれを含める必要がありますか?

char const * const * const my_strings

私はそれをまったく変更するつもりはないので、定数文字の配列の最初の要素への定数ポインタの配列の最初の要素への定数ポインタです。それは一口で、コードはほとんど読めません。これはすべて のような単純なデータ構造ですargv

const がデフォルトで、変更可能なキーワードが必要であるかのように感じます。

あなたは一般的にそれらconstの1つだけですか?多かれ少なかれ逆参照することで簡単に変更できる場合、そのポイントは何ですか?

4

1 に答える 1

7

通常、3 つconstの s のうち 2 つを使用します。

const char *const *my_strings;

3 つすべてを使用することもありますが、私の意見では、最後の 1 つが最も重要ではありません。変数 を使用するコードの分析にのみ役立ちますmy_stringsが、他の 2 つは が指す配列へのポインターmy_strings、またはその配列の要素が指す文字列へのポインターを持つコードの分析に役立ちます。これは通常、いくつかの異なる場所 (たとえば、関数の呼び出し元と関数自体) でより多くのコードになるため、より困難なタスクになります。

変数自体を使用するコードは のスコープに限定されるため、それがmy_strings自動変数 (関数パラメーターを含む) である場合は、十分に含まれており、タスクがより簡単になります。それをマークすることによって提供されるヘルプは、const依然として高く評価されるかもしれませんが、それほど重要ではありません。

また、char const * const * const my_strings「ほとんど読めない」場合は、C を読む練習を積むと状況が変わります。コードを変更するよりも、その練習をする方がよいでしょう。初心者が簡単に読める C コードを書くことにはいくらかの価値がありますが、仕事を成し遂げることほど価値はありません ;-)

typedef を使用して変数定義を短くすることができますが、多くの C プログラマーを悩ませる間接化を導入するという代償を払います。

typedef char const *ro_strptr;
ro_strptr const *my_strings;

何らかの理由で、C プログラマーは多くの場合、できるだけ多くの型を 1 か所で確認したいと考えています。型が本当に複雑になった場合 (関数へのポインター型) にのみ、型定義を使用して短縮することができます。

于 2012-08-09T00:17:25.483 に答える