2011-12-21 27 views
6

私は、多かれ少なかれ、私が持っているいくつかの「ポータブル」コード(それは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をばかげたクラスにする)。

+3

少なくとも1つのユーザ定義型を含まないキャスト(または演算子)を書くことはできません。 –

+0

「符号付き文字」を使用する従来のコードがありますか?私は非常にそれを疑う... –

+2

なぜuint8クラスばかげているのですか?迷子になっている世界的なキャスティング機能を持つよりも、それほどばかげたことではありません。 – ThomasMcLeod

答えて

1

私はオペレータの大ファンではありませんが、正しいことは何ですか?

次の操作を行うことができます

定義されるものでは
const char* operator+(const uint8* foo) 
{ 
    return (const char *)foo; 
} 

char* operator+(uint8* foo) 
{ 
    return (char *)foo; 
} 

、あなたの例を上から:

uint32 len2 = strlen(foo2); 

uint32 len2 = strlen(+foo2); 

になるだろうこれは、自動キャストではなく、この方法では、あなたはそれを簡単かつ明示的に行うことができます。

+0

ありがとう、良いアイデア! –

+0

うわー............ –

0

あなたが言及した両方のコンパイラには、 "signed chars as unsigned"スイッチがあります。それを使わないのはなぜですか?

+0

レガシーコードを破る。私が言ったように···2番目の文。 –

+0

ああ...あなたのプログラムの性質についてはわかりません。私は何か新しいことを書いていると思った! (あなたが最初の文で言ったように) –

3

グローバルキャスト(型キャスト)オペレータ、グローバル代入演算子、グローバル配列の添字演算子とグローバル関数呼び出し演算子のオーバーロードは、C++で許可されていません。

MSVS C++は、C2801 errorsを生成します。 Look at wikiは、C++演算子のリストとそれらのルールをオーバーロードします。

関連する問題