私は、多かれ少なかれ、私が持っているいくつかの「ポータブル」コード(それはLinux上で32ビットと64ビットMSVC2k10およびGCCをターゲットにしていることを意味する)書いている:C-文字列が常にuint8のあるグローバルな型キャスト演算子のオーバーロード?
typedef unsigned char uint8;
;これは文字列処理のためです。レガシーコードでは、署名付きでコンパイルされたcharが必要なので、コンパイラスイッチをデフォルトに設定して符号なしにすることはできません。
char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
あなたはインデックス深刻な影響なしに、実行時に負の数を配列にすることはできません。しかし、私は私ができる文字列ではない非常によく、インデックスの配列を処理しています。 C-文字列を符号なしにすることで、バグからの保護が容易になります。
char *をとる関数を使うたびにキャスト(char *)を保持する必要はなく、クラス関数の複製も停止するようにしたいと思います。定数文字列が暗黙的にcharとして渡されるので、これは私が仕事にこれらのすべてをしたい
int foo = strlen("Hello"); // "Hello" is passed as a char *
*特に痛みです:
char foo[500] = "Hello!"; // Works
uint8 foo2[500] = "Hello!"; // Works
uint32 len = strlen(foo); // Works
uint32 len2 = strlen(foo2); // Doesn't work
uint32 len3 = strlen((char *)foo2); // Works
の注意点は、おそらくあります。このような性質の暗黙の型変換が可能にしかし、毎回キャストなしでchar *をとる関数を使用するとよいでしょう。
だから、私はこのような何かが働くだろう考え出し:
operator char* (const uint8* foo) { return (char *)foo; }
そうでないが。私はそれを動作させる方法を理解できません。なぜ私はこれをする方法がないように思えるかを教えてくれるものは何も見つかりません。私は可能なロジックを見ることができます - それはFARの原因になる可能性があるような暗黙的な変換 - 多くのバグ - しかし、私は "これはCで動作しません+ +"何かを見つけることができませんまたは理由、 uin8をばかげたクラスにする)。
少なくとも1つのユーザ定義型を含まないキャスト(または演算子)を書くことはできません。 –
「符号付き文字」を使用する従来のコードがありますか?私は非常にそれを疑う... –
なぜuint8クラスばかげているのですか?迷子になっている世界的なキャスティング機能を持つよりも、それほどばかげたことではありません。 – ThomasMcLeod