Я хочу сделать что-то вроде этого:типа каламбурил предупреждение
#define EQ4(a_,b_) (*(int*)(a_)==*(int*)(b_))
char *s1 = "food";
char *s2 = "fred";
return EQ4(s1,s2);
но НКУ производит это предупреждение: Внимание: разыменования типа каламбурил указатель будет нарушать правила строгого сглаживания.
Я не думал, что то, что я делал, считалось разыменованием для целей строгого сглаживания, поскольку я не назначал разыменованный указатель на переменную указателя.
Я пробовал:
#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)
Что вы думаете об этом?
правильно выровнять их, не знать о gcc, но icc распознает правильно выровненную 'char *' s и не выдаёт предупреждение – hroptatyr
Спасибо за все ответы всем. Предупреждение из-за выравнивания интересно. Мы компилируем с -march = 686. В более ранней версии gcc я сравнивал свои трюки memcmp, и они появились намного быстрее, несмотря на не оптимальное выравнивание. Текущая версия gcc кажется улучшенной - она и снижает memcmp для небольших диапазонов. Я, вероятно, смогу прекратить использовать многие из этих трюков, но не все, поэтому меня все еще интересуют все разные идеи. – johnnycrash