今日はちょっと長く行ってみよう
const 定数ってのは便利だ しかし宣言に疑問を持った
>const int i=0; 普通はこうするだろう、若しくは、 >int const i=0; こうなる、初期化は必須である 無ければコンパイルエラーになるのは当然だ
しかしポインタの場合話が変わる >const char * p; コンパイルしてみよう、エラーが出ないはずだ おかしい そこで次のようにしてみる >char const * p; これもエラーが出ない、では >char * const p; ようやく初期化してないとエラーが出た では先の2件は何がconstなのであろうか ポインタなので、当然ポインタの先がある、それがconstなのだ よって、 >const char * p; >p[0] = 'A'; これはエラーである、同じく、 >char const * p; >p[0] = 'A'; もエラーである
要するに、この2つは同じ意味なのである >const char * p; >char const * p; いままでずっと >const char const * p; と書いてきた漏れはどうすれば・・・・・
そこで、今日知ったからには書き方を変えねばなるまい まず >const char * const p=pp; と書いてみる、2つ宣言するときはポインタでは >char *p, *r; とする、ではそれに習って、 >const char * const p = pp, * const n = pp; となるのだろうか? その通りである では、 >const char * const p = pp, *n = pp; これではnはconstなのだろうか? 正解はconstでは無くなる
ここで疑問が生じる 疑問1 >const int i=0,j=0; これはiとjはconstである、しかし次はどうだろうか >int const i=0,j=0; 当然両方constだろう では次の、 >int i, const j=0; ではどうだろう これは警告が出てconstが無視される
ポインタの場合は1文で変数ごとにconstを切り替えられるが int等ではできない 不思議だ
疑問2 >const int i=0; >const char* p; 同じ書き方だが、p自体はconstではない これはおかしい仕様だと思う >int const i=0; >char * const p=pp; これはp自体はconstになる しかし、 >int const i=0,j=0; >char * const p=pp, n=pp; これではnはconstどころかポインタですら無い >char * const p=pp, *n=pp; これだとポインタだがconstではない、結局、 >char * const p=pp, * const n=pp; こうである やはり仕様がおかしいと思うが、何か訳があるのだろう
仕方なく仕様に従うしかないので書き方を考える VCのコンパイラによるエラー文の型表示では、 >const char *const と表示される では今後はそう書こうではないか
変数とポインタの違いについてはどうするか、それは 1行に2つ以上constを宣言するな と言うことであろう 尤もだ
| |