miau's blog?

const 修飾子

今日も出勤とかしてますが。
C の const 修飾子周りでてこずってました。

#include <stdio.h>
#include <string.h>

void move_next(const char **pp)
{
if (IsDBCS(**pp)) {
(*pp) += 2;
} else {
(*pp)++;
}
}

int main()
{
char str[] = "hogeほげ";
char *p = str;

while (*p != '\0') {
if (IsDBCS(**pp)) {
/* なんか処理 */
} else {
*p = toupper(*p);
}
move_next(&p);
}

return 0;
}


これをコンパイルするとエラー発生。
move_next() は const char ** を渡すべきであって char ** は渡しちゃダメなんだそうで。

const char * に char * を代入したりできるから、てっきり上記も OK だと思っていたんだけど。

	const char *q;

:
:

q = p;
move_next(&q);

(これなら文法的には OK。ただここでやりたいことは実現できてない。)

move_next() の宣言から const を外せばいいんですけど。見てのとおり move_next() の中で文字列を操作しているわけじゃないので、気持ち悪い。

んー・・・これって C の仕様がおかしいんじゃないの?
とか思ったけど、よく考えると C++ のオーバーロードとかそのへんに対応するためなのかも。つまり

void move_next(const char **pp);
void move_next(char **pp);


を別の関数として実装できるから、区別できないと困るわけだ。

結局

	move_next((const char**)&q);


とするしかないっぽい。キャストは極力避けたい気もするんだけど、仕方ないか。



(2004/08/29 追記)

すいません。
> よく考えると C++ のオーバーロードとかそのへんに対応するためなのかも。
ってとこ、思いっ切り嘘ついてます。
C FAQ 11.10 参照のこと。

確かにオーバーロード対応だったら
> const char * に char * を代入したりできる
ってのが理屈に合わないですね。

posted at 23:16:21 on 2004-04-04 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。