3

私のデフォルトのcharタイプは、gccオプション(-funsigned-char gcc)で設定されている「unsignedchar」です。したがって、コードで「unsigned char」が必要な場合は、間違いなく「char」を使用できます。しかし、(char *)と(unsignedchar*またはsignedchar*)の間の変換について警告が表示されます:

"error: pointer targets in passing argument 1 of 'test2' differ in signedness"

unsigned char*変数をchar*に渡すときの警告を回避するにはどうすればよいですか(私のシステムには、コンパイラオプションで設定されたデフォルトのunsigned charがあることを知っています)?

static void test2(char* a)      //char is unsigned by deafult as set by -funsigned-char gcc option
{
}

void    test1(void)
{
        // This passes, but if i change it to unsigned char (or 'signed char') it fails   
        // I dont want it to fail for "unsigned char c" since default char is unsigned.
        char    c = 65; 
        test2(&c);
}
4

4 に答える 4

7

スイッチ-funsigned-char-fsigned-charは参照しませんchar *

-Wno-pointer-sign受け取る警告をオフにするために使用する場合があります。

于 2012-11-15T15:50:32.547 に答える
3

キャストを使用する:

char c = 65;   // weird magic :-(

test2((unsigned char *)(&c));

すべてのchar型はレイアウト互換であり、それらのポインターをキャストしても型のパンニングを構成したり、エイリアシング規則に違反したりすることはないため、これを自由に行うことができます。

于 2012-11-15T15:28:45.907 に答える
3

適切な解決策は、正しいタイプの変数を関数に渡すことです。つまり、関数がプレーン文字を予期している場合は、プレーン文字を宣言してそのアドレスを取得します。

C標準では、「char」、「signed char」、および「unsignedchar」は異なるタイプであるとされています。「char」は、コンパイラスイッチによって決定される「signedchar」または「unsignedchar」と同じ動作をする必要がありますが、これらを互換的に使用することはできません。-funsigned-charを使用するかどうかに関係なく、まったく同じように機能するコードを作成する必要があります。

別のポスターによるキャストの使用の提案は良くありません。警告を抑制するだけです。警告を明示的に無効にする方が明確です(たとえば、プラグマを使用するか、makefileで警告をグローバルにオフにします)。

キャストはコードの問題を修正せず、コンパイラがそれを指摘するのを停止するだけです。これはやや学術的なポイントですが、2の補数以外のシステムでは、符号付き文字にトラップ表現がある場合があります(値0 <= x <= CHAR_MAXとはレイアウト互換ですが、他の値とは互換性がありません)。そのため、コードがクラッシュする可能性があります。

あなたが与えた詳細に基づいて、実際的な用語では、あなたの最善の解決策はおそらく警告を無効にし、この点でコードが移植性がないという事実を受け入れることです。

于 2013-08-12T22:26:17.307 に答える
1

最後に私は答えを得ました:

-Wpointer-signは、-Wallおよび-pedanticによって暗示されます。警告を回避するには、-Wno-pointer-signを使用します

于 2012-11-15T15:49:39.307 に答える