2011-10-24 6 views
0

私は、short int型のエンディアンを交換するための基本的な機能を作成しようとしているが、それはエラーを投げています:C不正なオペレータエラー

short val = 0x1234; 
SwapEndian(&val); 
//val now contains 0x3412 

#ifndef __ENDIAN__ 
#define __ENDIAN__ 

#define Swap16(value) \ 
    ((((unsigned short)((value) & 0x00FF)) << 8) | \ 
    (((unsigned short)((value) & 0xFF00)) >> 8)) 

#define Swap32(value) \ 
    ((((unsigned)((value) & 0x000000FF)) << 24) | \ 
    (((unsigned)((value) & 0x0000FF00)) << 8) | \ 
    (((unsigned)((value) & 0x00FF0000)) >> 8) | \ 
    (((unsigned)((value) & 0xFF000000)) >> 24)) 

void __inline SwapEndian(short* value) //ERROR HERE 
{ 
    *value = Swap16(value); 
} 

#endif 

は、私のようなコードを使用します

私はVS2008を使用していますし、正確なエラーは次のとおりです。

C2296: '&' : illegal, left operand has type 'short *' 

私はこのエラーを修正するために何ができますか?

答えて

5

マクロがどのように展開されているかを見ると、何が間違っているのかがはっきりしています。

&valは、short*のポインタです。しかし、あなたはマクロがそれを直接パラメータとして扱います。したがって、あなたはポインタに対して整数演算を実行しようとしています。だから、これはに拡大します

:マクロは整数を期待しながら

((((unsigned short)((&val) & 0x00FF)) << 8) 
... 

&valは、タイプshort*です。

この関数では、マクロに渡す前に整数に逆参照する必要があります。

2

short* valueはポインタです。

あなたは別名、それを間接参照する必要があります。

void __inline SwapEndian(short* value) 
{ 
    *value = Swap16(*value); 
} 
2

この

void __inline SwapEndian(short* value) 
{ 
    *value = Swap16(*value); 
} 
をお試しください