Учитывая этот код, VC9 не обнаруживает сглаживание:ограничивают-edness с предварительно c99
typedef struct { int x, y; } vec_t;
void rotate_cw(vec_t const *from,
vec_t *to)
{
/* Notice x depends on y and vice versa */
to->x = from->y;
to->y = -from->x;
}
/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */
Очевидное исправление использовать временное:
void rotate_cw(vec_t const *from,
vec_t *to)
{
int temp = from->x;
to->x = from->y;
to->y = -temp;
}
Это стандартное поведение? Я ожидал, что компилятор, если не сказать так, предположил бы, что оба указателя будут, возможно, псевдонимом.
Да, это не стандартное поведение - выглядит как ошибка компилятора, по крайней мере, на C99 и C++. Им явно разрешено псевдонимы друг другу. Я не знаю, как это было на C89, и для вас это похоже :(Но я думаю, что читал на C89, все было еще более допустимо –
Вы ожидаете, что c позаботится о том, чтобы у вас был угловой футляр «Это не так: вы ожидаете, что будете беспокоиться об этих деталях для себя. Это может послужить основанием для рассмотрения языка более высокого уровня, но это * не * ошибка в c: компилятор делает именно то, что вы скажете это. – dmckee
@ dmckee: Чтобы быть справедливым, исправленная версия появилась на первом месте, и мне очень нравится мой макроассемблер;) – diapir