Я хочу сделать что-то вроде этого:
#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
Есть ли способ использовать строгое предупреждение псевдонимов, но все же делать такие вещи?
Спасибо!
EDIT
Это не работает:
#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)
Что вы все думаете об этом?