私はこのようなことをしたい:
#define EQ4(a_,b_) (*(int*)(a_)==*(int*)(b_))
char *s1 = "food";
char *s2 = "fred";
return EQ4(s1,s2);
しかし、gcc は次の警告を出しています:
逆参照されたポインターをポインター変数に割り当てていなかったので、私が行っていたことが厳密なエイリアシングの目的での逆参照としてカウントされたとは思いませんでした。
私は試した:
#define EQ4(a_,b_) (*(const int const *)(a_)==*(const int const*)(b_))
違いはありませんでした。
Redhat Linux バージョン 2.6.32-220、gcc バージョン = 4.4.6
厳密なエイリアシング警告を使用する方法はありますが、それでもこのようなことを行いますか?
ありがとう!
編集
これらは機能しません:
#define EQ4(a_,b_) (*(int*)(char*)(a_)==*(int*)(char*)(b_))
#define EQ4(a_,b_) (*(int*)(void*)(a_)==*(int*)(void*)(b_))
#define EQ4(a_,b_) (*(int* __attribute__((__may_alias__)))(a_)== \
*(int* __attribute__((__may_alias__)))(b_))
これは機能します:
typedef union bork { char a[4], int n32 } __attribute__((__may_alias__)) TBork;
#define EQ4(a_,b_) ((TBork*)(a_)->n32==(TBork*)(b_)->n32)
皆さんはこれについてどう思いますか?