2015-02-03 5 views
-1

나는 두 개의 서로 다른 선언과 함께 '계산'방법이 있습니다매크로

int calculate(int parmA); 
int calculate(int parmA, int parmB, int parmC); 

가 난 단지 대체 'calculateNew'를 호출 (파르마를 int)를 계산하려면 :

int calculateNew(int parmA); 

나는 두 가지 방법으로 정의하여 시도했다 : 나는이 작업을 수행 할 때

#define calculate calculateNew 
#define calculate(parmA) calculateNew(parmA) 

내가에서 컴파일러 오류를 얻을 수 다른 수의 인수로 인한 코드의 다른 부분 :

macro "calculate" passed 2 arguments, but takes just one 

여기서 내가 뭘 잘못하고 있니? 전 처리기에게 인수가 하나만있는 경우 대체하도록 어떻게 알 수 있습니까? 내가 할 수 있을까?

참고 :이 방법이이 문제에 대한 최선의 방법은 아닐 수도 있지만 이렇게해야합니다.

+4

매크로가 작업을위한 잘못된 도구입니다. 원하는 IDE에서 리팩토링 기능을 사용하십시오. –

+1

과부하를 제어합니까? 내 말은, 그들 중 하나의 이름을 바꾸는 것 (또는 네임 스페이스에 넣는 것)에 옵션을 쓰는 것입니까? – Angew

+0

@remyabel 문맥을 모른 채 어떻게 그런 말을 할 수 있습니까? 리팩토링은 확실히 그 일을위한 도구가 아닙니다. 매크로는이를 수행하는 방법이 아닐 수도 있지만, 특정 조건에서 두 가지 기능을 사용하여 서로 다른 동작을 정의 할 수 있어야하며 이러한 기능 중 하나는 해당 조건이 충족 될 때 다른 기능 대신 실행됩니다. – BlunT

답변

0

의견과 제안 된 답변을 고려하여 필자는 매크로가 문제의 해결에 적합하지 않기 때문에 실제로 필요한 부분을 변경했습니다.

비록 내가 솔루션을 정말 좋아하지는 않지만, 그것은 일을 끝내고 나중에 좀 더 강력한 솔루션을 만들기 위해 약간의 시간이 걸릴 것입니다.

나는, 오류없이

int calculateSimple(int parmA); 
int calculateComplex(int parmA, int parmB, int parmC); 

이 방법은 내가 쉽게

#define calculateSimple calculateNew 

매크로

로 전화를 대체 할 수와 두 선언

int calculate(int parmA); 
int calculate(int parmA, int parmB, int parmC); 

교체, 리팩토링을했다 모든 것이 예상대로 작동합니다.

도움 주셔서 감사합니다.

+0

코드를 읽는 모든 사람들이 실제로 코드에 쓰여진 것보다 다른 함수를 호출한다는 사실을 깨닫지 못할 수도 있습니다. 두 함수의 이름을 이미 바꿨을 때 코드에서'calculateSimple'을'calculateNew'로 바꾸면 어떨까요? 더 명확하게 만들면 매크로를 제거 할 수 있습니다. –

+0

@a_guest 목표는 특정 동작을 에뮬레이트 할 수 있기 때문에 특정 변수를 정의 할 때 해당 함수에 대한 호출이 새로운 함수로 바뀝니다. 이것은 기본 동작이 아니며 항상 calculateNew를 실행하려고합니다. 그렇지 않으면 외부 데이터에 종속적 인 동작을 에뮬레이션하는 테스트를 수행해야 할 때 일련의 함수를 교체해야합니다. 이 방법으로 이러한 함수는 테스트를 수행하는 데 필요한 데이터를 생성 할 수 있습니다. – BlunT

1

전 처리기 시간에 알려진 일부 속성을 기반으로 하나 또는 다른 전화를 걸려고한다는 의견을 사용자 의견에서 취합니다. 원래 과부하의 이름을 바꿀 수 있다면 인라인 트램펄린을 만들 수 있습니다. 이 추가 다음 originalCalculate에 원래의 단일 인수 과부하 이름을 바꾸고 :

inline int calculate(int parmA) 
{ 
#if new_should_be_used() 
    calculateNew(parmA); 
#else 
    originalCalculate(parmA); 
#endif 
} 

서로 다른 컴파일 단위에서 다른 동작을해야하는 경우, 단지 staticinline를 교체합니다.

1

리팩토링은 분명히 이동해야합니다. 그렇지 않으면 코드가 엉망이되어 유지 관리가 더 어려워지기 때문입니다. 하지만 3 개 인수 calculateNew에 과부하가 걸리지 않는 이유 (즉, 다른 모든이 무엇 때문에) 그냥 오버로드 된 하나의 초기 버전 전화 당신은 실제로 "해결 방법"을 원하는 경우 :

int calculateNew (int a) { whatever }; 
int calculateNew (int a, int b, int c) { return calculate(a, b, c); }; 

그런 다음 사용할 수를 calculatecalculateNew으로 바꾸려면 IDE를 &으로 바꾸십시오.