今日も出勤とかしてますが。
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 * を代入したりできる
ってのが理屈に合わないですね。