我想做这样的事情:
#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)
大家对此怎么看?