Path: sran124!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 28 Aug 90 08:54:43 Organization: Software Research Associates, Inc.,Japan In-reply-to: zic@tci.toshiba.CO.JP's message of 24 Aug 90 04:49:53 GMT Newsgroups: fj.lang.c Subject: Re: Is there a way to use ANSI C libraries on unix machines? Distribution: fj References: 記事 で zic@tci.toshiba.CO.JP (Nobuyoshi Kamei) さんいはく > # 'const' type qualifier の使い方が今一つ理解できない。 > # 特に、プロトタイプ宣言中の引数に、 > # const char * const st > # と書いた場合の意味が。 (st は型名ではないものと考えました。) (1)まず、 const st という部分から、st という識別子は read only なオブジェクトであることが 宣言されます。 つまり、 st = (char *)NULL のように代入したり ++ 演算子を適用すること等は許されないことになり、 コンパイラがそのような不正な記述を検出してくれることにもなります。 (2)さらに const .... * .... st (本質的でない識別子等は .... で表示) という部分から、*st は read only なオブジェクトであることが宣言されます。 このことから、例えば *st = '¥0' などのような代入は許されないことになります。 この宣言は、関数プロトタイプ宣言の中の仮引数として書かれても その他(例えば一時変数や大域変数)として書かれても、特に意味が 違っているわけではありません。ですから、 extern const char * const st; 等と書けば、(恐らく)大域変数である st が(この記述がなされたモジュール内で) (1)(2)のような制約をもつことになり、一方 int aFunction(const char * const st); とかけば、関数 aFunction の仮引数 st が(1)(2)のような制約をもつことと なります。念のために述べますと、ここで制約を持つのはもちろん (const によって修飾された)仮引数 st であって、実引数は関係ありませんから、 { char *p; aFunction(p++); のような表現はなんら問題ありません。 直感的には、aFunction のような宣言がわざわざなされるということは、 (a) aFunction では、渡されてきた st というポインタを使って、その 中身を書き換えるような副作用は引き起こさないことを保証する。 (b) aFunction では、渡されてきた st は関数内のいたるところで 同じ値を保持し続けると信じてコードを記述してよい。 という言明をしていることになると思います。あるいはそのような表明を 形式的に行ないたい場合に aFunction のような記述をするのでしょう。 (a) のような表明は非常に有用だと思います。 関数プロトタイプ宣言の仮引数のところに const char * const st の ような記述があった場合には、内側の(後ろの)const は関数を外から眺めて いるぶんにはあまり意味をもちません。(仮引数 st の振舞いは関数外から 見えないから。)内側の const は、関数の実装方法に関する (b) のような 表明と考えていいかと思います。 -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所 Not execute, but evaluate.