2012-11-12 2 views
3

을 고려 함수를 작성하는 방법은 다음과가능 앨리어싱

void fun(Thing *one, Thing *two, Thing *ret); 

내가 ret이 나 one에 의해 별명되지 않을 수 있다는 사실을 고려하고 싶은 나 같은 프로토 타입 함수를 작성하고 싶습니다 two. 필요한 경우 런타임에이 값을 결정하고 적절한 코드를 호출해야합니다.

이것은 나쁜 생각입니까? 이 언어 의미가 있습니까?

편집 : 나는 자연스럽게 작동하지만 매우 장황하게 보이는 if (one == ret || two == ret)처럼 손으로 테스트하고 싶지 않다는 것을 분명히하지 않았다. 또한 두 개의 거의 동일한 경우에 대해 중복 된 코드를 원하지 않습니다 (한정자 만 다릅니다). 나는 더 이상 관용적으로 좋은 해결책이 무엇인지, 그런 경우를 지원하는 언어 의미가 있는지 찾아야한다.

+1

쉬운 ...'(ret == one || ret == two) {/ * 별명 * /} else {/ * 별칭이 아닌 * /}' – Mankarse

+0

@Caribou는 함수는'fun (& a, &b,&a);' –

+1

@RoeeGavirel yep - quicke에 댓글을 달았습니다.) – Caribou

답변

4

많은 클래스가 문제의 클래스 의미에 따라 다르지만 별칭 지정 테스트가 필요하지는 않습니다. 아무 것도 수정하기 전에 onetwo에서 필요한 모든 정보를 얻으십시오. 또한 수정을 시작하기 전에 예외를 발생시킬 수있는 작업을 완료했는지 확인할 수도 있습니다.

1

"스왑"기능과 같이 많은 시간이 소요될 수 있습니다.

void fun(Thing *one, Thing *two, Thing *ret) 
{ 
    if (ret == one || ret == two) 
    { 
     //Alias - Spacial case 
     return; 
    } 
    //Not Alias, continue usually... 
} 

편집 : :이 기능은 사용하지 않고 두 개의 서로 다른 매개 변수에 같은 값을받은 경우 알 수있는 방법이 있는지 당신이 묻는 것 같다 당신의 편집을 읽은 후 "당신은 포인터의 값을 확인할 수 있습니다 if "문.
그렇다면 C 나 C++에서는 이것을 달성 할 수 없습니다.
포인터 또는 값이 아니기 때문에 값이있는 매개 변수 일뿐입니다.

+0

하지만 왜? 일반적으로 객체의 앨리어싱에 대해 걱정할 필요가 있다면 잘못된 것을하고있는 것입니다. (C 스타일 배열은 다른 문제입니다.) –

+0

@JamesKanze 달성하고자하는 구현이 무엇인지 알 수 없습니다. 포인터는 여기에서 피할 수 있습니다. 그러나 당신이 그것을하고 싶다면, 이것은 방법입니다. –

+0

입력 값 중 하나도 null이 아닌지 확인하는 것과 같습니다. 당신이 "쓰레기통에있는 쓰레기"방식으로 일하는 것이 아니라면, 이것은 또한 앨리어싱 문제를 암시합니다. –