문제

이 코드를 고려할 때 VC9는 앨리어싱을 감지하지 않습니다.

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;
}

이 표준 행동입니까? 나는 그렇게 말하지 않는 한 컴파일러가 둘 다 포인터는 아마도 별명 일 수 있습니다.

도움이 되었습니까?

해결책

이 답변을 확인하십시오.

넣어보십시오 __얽매다 매개 변수 이전에는 MSVC가 경고를 제공하는 것을 발견 한 유일한 방법 인 것 같습니다.

다른 팁

C89 또는 C99에서 작성된 코드는 완벽하게 유효합니다. 모호하지만 컴파일러가 진단 할 것이 없으므로 진단하지 않습니다.

함수의 두 매개 변수에서 C99와 '제한'을 사용하면 컴파일러가 C99를 지원하면 오류가 발생합니다. AFAIK, 현재 MSVC 버전은 없지만 C99를 완전히 지원합니다.

C99가 발명되기 전에 restrict 한정자, 일부 C 컴파일러에는 최적화 옵션이 포함되어있어 포인터 사용에 대한 특정 가정을하도록 지시합니다. 그러한 컴파일러에 대해 내가 본 매뉴얼은 그러한 최적화가 ~ 아니다 표준을 준수하며 표준 및 프로그래머 의도에 위배되는 방식으로 행동하기 위해 행동이 표준에 의해 정의 된 특정 구성을 사용하여 코드를 임의로 유발할 수 있습니다. 매뉴얼의 관점에서, 최적화는 컴파일러에 C의 서브 세트를 컴파일하라고 지시하는 C에서 정의 된 특정 코너 케이스의 동작을 정의하지 않지만 해당 경우에 대해보다 효율적인 코드를 생성 할 수있게 해줍니다. 정의했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top