Dokusyo-nissi Bessitu 2005-06-16 φ(-_-) ■ [lang]はじめての C ヘッダファイルの stddef.h が tutorial にチラッとでてきたので、The Standard C Library をのぞいてみた。 The Standard C Library 手元にあってもなかなか読むことがないし、NULL のところだけでもチェックしてみる。 NULL - the macro NULL - を実現させるには、単に、もっとも適切ないくつかの選 択肢 - 0, 0L あるいは (void *)0 - を選ぶことです。 適正に作動させるため、ポインタの型の引数として、関数原型 - function prototype - を欠いている void型を (あるいは char, signed char または unsigned char) を 1種類選択します。 (NULL の詳細の多くについては、220 ページで検討します) より簡潔にするのであれば、おそらく、 C 固有の null ポインタ定数 - null-pointer constant - を含むことになります。 何度かは、そのような忠告が生じることもあるでしょう。 にもかかわらず、通常では、NULL が用いられる場合の方法としては、この種類のな かの 1つで十分です。(p216) (訂正) 本の名前をまちがってた ... oLr 2005-06-17 φ(-_-) ■ [lang]はじめての C (続き) NULL は、たいていの一般的な null ポインタ変数としての目的に適っています。 データオブジェクトポインタとして用いることで、プログラムでは、宣言された - declare - (または割り当てられている - allocate -) データを含まないオブジェ クトを指し示します。 216 ページで触れたように、このマクロは、0, 0L または (void *)0 のどれかを定 義 - definition - としてもつことができます。 最後の定義ですと、他のオブジェクトポインタとも一致します。 ただし、関数へのポインタ - function pointer -とだけは矛盾してしまいます。 というのも、次のようには書けないからです。 int (*pfun)(void) = NULL; /* WRONG */ この変換 - translation - だと、たぶんエラーがでて - complain - しまいます。 この表記された型 - expression type - は、初期値としてセット - initialize - させたいデータオブジェクトと一致しません。(p220) (注) 関数へのポインタ tutorial には、引数をもたず、返り値のない例があげられている。 main() { void (*pf)(void); /* 関数のポインタの宣言 */ void f(void) { printf("Hello, world.\n"); } /* pf に値をセット */ pf = f; /* 呼び出しは次のどちらでも OK */ (*pf)(); pf(); } (追記) コードがアヤフヤだったので、書き直し。 [コメントを書く] # nuc 『はじめまして。nucと申します。 関数の中で関数を宣言するのはgcc拡張と呼ばれるgccというコンパイラのみで使える技 で、http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/gccextend.html でも警告されていますが、「はじめての C」ではよろしくないかと。』 # sekiyo 『nuc さん、こんばんは。(ちょっと返事が遅れました) そうですね。 Linux では $cc でコンパイルしても、gcc に自動的にリンクされるのを忘れてました。 』 2005-06-19 φ(-_-) ■ [lang]はじめての C (続き) 現在のプログラミングスタイルでは、呼び出されたすべての関数に対して、プロト タイプ - function prototype - が宣言されます。 にもかかわらず、関数の引数 - function argument - がどこかは、パラメータ宣言 と対応していないという重要なコンテクスト - context - がいまだに存在していま す。 これは、関数が呼び出された時点で、可変引数リスト - variable argument list - を引き受けている、ということです (例えば で宣言される printf がそ うです)。 特別な引数については、古い C のルールが適用されます。 少数の例外を除くと、多くのスタンダードな型変換 - type conversion - では、各 変数を正しく受け取ることは、プログラマの自由にまかせられて - be up to you - います。(p220) 2005-06-20 φ(-_-) ■ [lang]はじめての C (続き) 初期の C の実装では、すべてのポインタが同じ表記法 - representation - をもっ ていました。 通常、この表記法だと、integer 型の int か long の 1つと同じサイズになります 。 ですので、10進法定数 - decimal constant - の 0 または 0L のいずれかが、うま いぐあいに、どの型についても、 null ポインタのように振舞います。 2つの定数のうちの 1つを NULL で定義すれば、任意のポインタ - arbitrary pointer - に対して割り当てることができます。 このマクロは、特に、引数表記 - argument expression - として役立ちます。 注意してほしいのは、この表記法が、いくつかのポインタの型をもつ、null ポイン タ定数だということです。(p220) 2005-06-21 φ(-_-) ■ [lang]はじめての C (続き) このような実装のうち、最も安全な NULL の定義が (void *)0 です。 保証されてはいませんが、しかし、この void へのポインタは、その表記が他のど のポインタとも同じになります。 ただし、もちろん、関数へのポインタには割り当てられず適合もしません。 その意味は、全般的な - universal - null ポインタ定数としての NULL は書くこ とができないからです。 また、任意のデータオブジェクトポインタの位置にある引数表記としても、安全に 使うことはできません。 単に、文字ポインタ - character pointer - のように、または一般的な - generic - void へのポインタのように正確にふるまうことを保証されている、ということで す。(p221) 2005-06-22 φ(-_-) ■ [lang]はじめての C (続き) この本のスタイルとしては、できるだけ NULL を使うようにします。 null ポインタが差し出す、役に立ちますよという合図 - useful signal - に気が ついたからです。 関数ポインタには、null ポインタ定数を生成する - generate - キャスト型を 使います。 またキャストは、特に、求められる型が void へのポインタとは別な場合、関数 への引数を、可変引数リストを引き受けるために用います。 NULL が、2分の1 ダースもの異なったヘッダで宣言されているのに気づいたでしょ う。 それは、このマクロを使うための選択を容易にするためです。 1つだけアドバイスするとすれば、いつでも一定のスタイルを選んでおき、それを見 限ることのないようにすること、ですね。(p221) 2005-06-24 φ(-_-) ■ [lang]はじめての C ついでに C Library の Apprendix C から、 引数 (argument) : 関数呼び出し時に、1つのパラメータに対しその初期値 - initial value - を規定する表記のこと。 表記法 (expression) : C プログラムでは、トークンの連続したシーケンスを指し 、どのように値を計算するかを指定する、そして思わぬ結果 - side effect - が起 きることも。 型 (type) : 値の属性。表示を確定することで、その機能を操作することができる 。または関数の属性。どの引数が求められているか、と返り値が何かを確定する。 表記 (representation) : さまざまなビットパターンのもつ内容により、データオ ブジェクトタイプを表示する - represent - ため使われるビット数 - the number of bits - のこと。 (追記) やはり expression は、「式」と訳したほうが わかりやすいかもしれません